[문제]
https://www.acmicpc.net/problem/1072
1072번: 게임
김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시
www.acmicpc.net
[문제 풀이]
신경을 써줘야 하는게 많았던 문제.
숫자를 늘리면서 z가 바뀔때를 파악하면 되는데 단순히 1씩 늘리면서 파악하면 시간초과가 나기에 이분탐색을 써줘야 한다.
x의 범위가 10억까지라서 int로 계산을 하게 될 경우에 오류가 나는 경우가 많이 생긴다! (solve() 함수에 long long으로 x 와 y를 받아온 이유)
z가 99 이상이면 바뀌지 않는다.(반올림이 아니라 소수점을 버리기 때문에 99%가 절대 100퍼센트가 될 수가 없다.)
x의 최대 범위인 10억을 우측으로 0을 좌측에 주자.(13~14)
파악해야 하는건 최소로 변하는 값이기 때문에 z하고 범위를 최대한 줄여주자.(20~24)
이분탐색을 돌려주자.(16~26)
[코드]
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
31
32
33
34
35
36
|
#include<iostream>
#define endl "\n"
using namespace std;
void solve(long long x,long long y){
long long z = (100 * y) / x;
if(z>= 99){
cout<<"-1"<<endl;
return;
}
long long right = 1000000000;
long long left = 0;
while(left<=right){
long long mid = left + right;
mid = mid / 2;
int temp = (100 * (y + mid)) / (x + mid);
if(temp > z){
right = mid-1;
}
else if(temp <= z){
left = mid +1;
}
}
cout<<left<<endl;
}
int main(){
int x,y;
cin>>x>>y;
solve(x,y);
return 0;
}
|
cs |