반응형
최대 값 설정, 승률 계산 방식을 신경써 푼 기본 이분탐색 문제였습니다.
풀이방법
앞으로 할게임 수를 mid로 두어 z값이 바뀌는 최소값을 이분 탐색을 통해 찾습니다.
1. 승률이 99%라면 게임을 아무리 많이해도 100%가 될 수 없으므로 -1을 반환합니다.
2. 승률이 달라질 경우(기존 승률보다 ) r = mid - 1, 아닐경우 l = mid+1로 l<=r 인 동안 계속 l,r을 갱신해줍니다.
3. 최종 l은 마지막으로 바뀌는 mid값에서 + 1되므로 이 값이 앞으로 해야할 최소한의 게임 수가 됩니다.
Code
#include <bits/stdc++.h>
#define ll long long
#define MAX 1000000000
using namespace std;
ll game,win;
ll binarySearch(){
ll l = 0;
ll r = MAX;
ll firstZ = 100 * win /game;
if(firstZ >= 99) return -1;
while(l<=r){
ll mid = (l+r) / 2;
ll z = 100 * (mid+win)/(mid+game);
if(firstZ < z) r = mid - 1;
else l = mid + 1;
}
return l;
}
int main(){
cin >> game >> win;
cout << binarySearch() <<'\n';
}
'Algorithm > Binary Search' 카테고리의 다른 글
(C++) - 백준(BOJ) 2141번 : 우체국 답 (0) | 2021.01.18 |
---|---|
(C++) - 백준(BOJ) 2022번 : 사다리 답 (0) | 2021.01.17 |
(C++) - 백준(BOJ) 2110번 : 공유기 설치 답 (0) | 2020.10.16 |
(C++) - 백준(BOJ) 11561번 : 징검다리 답 (0) | 2020.10.03 |
(C++) - 백준(BOJ) 2473번 : 세 용액 답 (0) | 2020.09.21 |