문제 링크: https://www.acmicpc.net/problem/1072
식을 세워서 O(1)로 해결할 수 있습니다.
일단 승률이 99% 이상이면 승률을 올리는 것이 불가능합니다. 승률이 100%이면 당연히 101%로 올리는 것은 불가능하고요, 99%인 경우도 100%로 올릴 수 없습니다.
그럼 승률이 98% 이하일 때 몇 판을 이겨야 승률이 1% 올라갈까요? 적당히 식을 세워서 알 수 있습니다.
\[Z=\left\lfloor \frac{Y}{X} * 100 \right\rfloor\]
Z는 현재 승률이고 위 식으로 계산할 수 있습니다.
n판을 더 이겼을 때 승률이 1% 올라간다고 했을 때 식을 세워봅시다. 이때 승률을 Z+ 라고 하겠습니다.
\begin{align}
\frac{Y+N}{X+N} &= \frac{Z^+}{100} \\
100Y+100N &= Z^+(X+N) \\
(100-Z^+)N &= Z^+*X-100Y\\
\therefore N &= \left\lceil \frac{Z^+*X-100Y}{100-Z^+} \right\rceil
\end{align}
참쉽죠?
이분탐색으로도 아마 풀 수 있지 않을까 생각합니다.
#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ll x, y;
cin >> x >> y;
if ((y*100) / x >= 99)
cout << -1 << '\n';
else {
ll z = (y * 100) / x;
++z;
ll nn = z*x - 100*y;
if (nn % (100 - z) == 0)
cout << nn / (100-z) << '\n';
else
cout << (nn / (100-z)) + 1 << '\n';
}
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 17370: 육각형 우리 속의 개미 (0) | 2020.07.19 |
---|---|
[백준][C++] 18917: 수열과 쿼리 38 (0) | 2020.07.18 |
[백준][C++] 1051: 숫자 정사각형 (0) | 2020.07.17 |
[백준][C++] 17390: 이건 꼭 풀어야 해! (0) | 2020.07.17 |
[백준][C++] 14425: 문자열 집합 (0) | 2020.07.16 |