https://www.acmicpc.net/problem/1072
이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.(중략)
X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.
형택이의 승률이 변하는 게임의 횟수를 구하는 문제이다.
문제의 포인트
문제를 파악하고, 이를 통해 이분 탐색을 활용할 수 있는가?
코드
#include <iostream>
using namespace std;
long long int f(long long int x, long long int y)
{
return y * 100 / x;
}
int main(void)
{
long long int x, y;
cin >> x >> y;
long long int z = f(x, y);
if (z >= 99)
{
cout << -1;
return 0;
}
long long int left = 0;
long long int right = x;
long long int ans;
while (left <= right)
{
int mid = (left + right) / 2;
if (f(x + mid, y + mid) > z)
{
right = mid - 1;
ans = mid;
}
else
left = mid + 1;
//cout << mid << endl;
}
cout << ans;
return 0;
}
여담
이분탐색을 활용해야할지 약간 막막했다. 문제에 익숙해지고, 개념을 익히기 위해 나중에 lower_bound를 활용해 풀어보고 싶다.
'코딩테스트' 카테고리의 다른 글
백준 18405번 경쟁적 전염 C++ 풀이 (0) | 2022.12.01 |
---|---|
백준 12015번 가장 긴 증가하는 부분 수열 2 C++풀이 (0) | 2022.12.01 |
백준 5430번 AC C++ 풀이 (0) | 2022.11.22 |
백준 10799번 쇠막대기 C++ 풀이 (0) | 2022.11.21 |
백준 1620번 나는야 포켓몬 마스터 이다솜 C++ 풀이 (0) | 2022.11.11 |
댓글