티스토리 뷰

728x90

www.acmicpc.net/problem/1072

 

1072번: 게임

각 줄에 X와 Y가 주어진다. X는 1,000,000,000보다 작거나 같은 자연수이고, Y는 0보다 크거나 같고, X보다 작거나 같은 자연수이다.

www.acmicpc.net

 

C++ 이분탐색

(12분전)

앞으로 하는 게임은 모두 이긴다는 가정에서 최소 몇판을 더해야 승률이 변하는지 구하는 문제

99%일때와 100%일때는 아무리 게임을 더해도 승률이 절대 변하지 않는다 (-1출력)

X의 최댓값이 1000000000이라 추가로 더 하는 게임 횟수의 최댓값도 1000000000이다.

이분탐색의 범위는 1,1000000000

 

Z(승률) 구하는 식을 그대로 쓰면 50 29 일때 값이 틀리게 나온다

그래서 Y*100/X로 구해야하는데 Y/X를 할때 정수라 값 손실이 있어서 그런 것 같다.

범위는 int 범위인데 int로 하면 틀린다.

(이유는 자세히 찾아보진 못함 계산하는 중에 범위가 초과되서 그런것같은데..100%이해하진 못함)

 

소스코드

#include <iostream>
using namespace std;
long long X, Y;// X : 게임 횟수, Y: 이긴 게임
long long Z;

long long binarySearchMax(long long s, long long e){
    long long mid = 0;
    while(s <= e){
        mid = (s+e)/2;
        if((Y+mid)*100/(X+mid) > Z){
            e = mid-1;
        }else{
            s = mid+1;
        }
    }
    return s;
}
int main(){
    cin >> X >> Y;
    
    Z = (Y*100)/X;
    if(Z>=99){
        cout << -1;
        return 0;
    }
    cout << binarySearchMax(0, 1000000000);
    return 0;
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함