본문 바로가기

문제풀기이야기

1072번_게임_BOJ

문제 링크

1072번 게임 : https://www.acmicpc.net/problem/1072




문제 설명 및 해결 아이디어

주어진 게임횟수는 최대 1,000,000,000이다. 시간초과가 날 수 있기 때문에 Parametric Search로 접근해야 한다. 

mid를 게임횟수로 설정하여, 승률(Z)이 변할 때의 mid의 최소값이 문제의 출력이된다. 




코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long int
#define INF 9999999999999999
 
ll total, win;
ll originRatio, newRatio;
ll func() {
    ll left = 1, right = 1000000000;
    ll ret = INF;
    originRatio = win * 100 / total;
    while (left <= right) {
        ll mid = (left + right) / 2;
        newRatio = (win + mid) * 100 / (total + mid);
        if (originRatio < newRatio) {
            right = mid - 1;
            ret = min(ret, mid);
        }
        else
            left = mid + 1;
    }
    return ret;
}
 
int main() {
    while (scanf("%lld %lld"&total, &win) != EOF) {
        ll res = func();
        printf("%lld\n", res == INF ? -1 : res);
    }
 
    return 0;
}
cs


'문제풀기이야기' 카테고리의 다른 글

2343번_기타 레슨_BOJ  (0) 2018.07.16
2805번_나무 자르기_BOJ  (0) 2018.07.15
14502번_연구소_BOJ  (0) 2018.06.25
14503번_로봇 청소기_BOJ  (0) 2018.06.25
14499번_주사위굴리기_BOJ  (0) 2018.06.25