승률을 올리기 위해 필요한 최소 판수를 출력하는 문제다.


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

+ Recent posts