1072번: 게임
각 줄에 X와 Y가 주어진다. X는 1,000,000,000보다 작거나 같은 자연수이고, Y는 0보다 크거나 같고, X보다 작거나 같은 자연수이다.
www.acmicpc.net
[문제 풀이]
이분 탐색을 이용하여 문제를 풀었습니다.
이 문제는 승률 Z를 변화시킬 수 있는 최소 게임판 수를 구하는 문제였습니다.
X의 최대값이 10억이기 때문에 브루트 포스로 문제를 해결하려 할 경우 시간초과가 납니다. 따라서 이분 탐색을 이용하여 문제를 해결했습니다.
이용한 로직
- left = 0, right = X 로 초기화합니다.
- 이분 탐색 중에 나온 mid의 값이 승률을 변화시켰다면 값을 비교해줍니다.
- 이분 탐색 중에 나온 mid의 값이 승률을 변화시키지 못했다면 더 큰 값을 찾아줍니다.
[코드]
#include<iostream>
using namespace std;
long long int X, Y, answer = 1000000000;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> X >> Y;
long long int Z = 100 * Y / X;
if (Z == 100 || Z == 99) {
cout << -1 << endl;
return 0;
}
long long int left = 0;
long long int right = X;
while (left <= right) {
long long int mid = (left + right) / 2;
if (Z < 100 * (Y + mid) / (X + mid)) {
if (answer > mid)
answer = mid;
right = mid - 1;
}
else {
left = mid + 1;
}
}
cout << answer << endl;
return 0;
}
'algorithm > BOJ' 카테고리의 다른 글
백준 1806_부분합(C++) (0) | 2020.10.09 |
---|---|
백준 2096_내려가기(C++) (0) | 2020.10.08 |
백준 2805_나무 자르기(C++) (0) | 2020.10.06 |
백준 2003_수들의 합 2(C++) (0) | 2020.10.05 |
백준 1103_게임(C++) (0) | 2020.10.05 |