승률을 올리기 위해 필요한 최소 판수를 출력하는 문제다.
99,100%에서는 더이상 올릴 수 없으므로 -1을 출력하고
나머지는 이분탐색으로 하면 된다.
worst case라 생각되는 x=1000000000(10억), y=980000000(9억8천만) : 승률 98% 때도
10억번 이기면 승률이 99%로 올라가기 때문에 이분탐색시 최대치는 적당히 저거보다 높게 잡아주면 될 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> typedef long long ll; int main() { ll x, y; while (scanf("%lld%lld", &x, &y) != EOF) { ll p = (100*y) / x, ans = 0, l = 1, r = 2e9; if (p == 99 || x == y || p == 100) { printf("-1\n"); continue; } while (l <= r) { ll mid = (l + r) / 2; if ((100*(y + mid)) / (x + mid) == p) l = mid + 1; else { ans = mid; r = mid - 1; } } printf("%lld\n", ans); } return 0; } | cs |
'BOJ' 카테고리의 다른 글
5670 휴대폰 자판 (0) | 2018.02.18 |
---|---|
5052 전화번호 목록 (0) | 2018.02.18 |
11559 Puyo Puyo (0) | 2018.02.18 |
4963 섬의 개수 (0) | 2018.02.18 |
11812 K진 트리 (0) | 2018.02.18 |