문제
https://www.acmicpc.net/problem/1072
1072번: 게임
김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시
www.acmicpc.net
코드
#include <iostream>
using namespace std;
int main(){
long long x,y;
cin >> x >> y;
long long z=100*y/x;
long long start=0;
long long end=x;
long long result=-1;
while(start<=end){
long long mid=(start+end)/2;
long long k=100*(y+mid)/(x+mid);
if(k>z){
result=mid;
end=mid-1;
}else{
start=mid+1;
}
}
cout << result << ' ';
return 0;
}
정리
(1) z=(double)y/x*100이라고 하면 문제가 풀리지 않고 (2) z=100*y/x라고 하면 문제가 잘 풀린다.
(1) 같은 경우는 소수점까지 구하고 100을 곱하는 방식이고 (2)는 100을 y에 먼저 곱하고 x로 나누어서 그 몫을 구하는 방식이다.
정확하지는 않지만 (1)의 경우에는 소수점 연산을 하기 때문에 문제가 되는 것 같다. 컴퓨터에서 소수점을 구할 때 약간의 오차가 있다고 어디선가 들어본 적이 있다.
퍼센트나 분수와 같은 문제가 나올 경우 되도록 소수점 연산을 하는 방법은 피해야겠다.
참조
'Beakjoon > binary search' 카테고리의 다른 글
[백준] 7795번 먹을 것인가 먹힐 것인가 (C++) - binary search (1) | 2022.09.21 |
---|---|
[백준] 2512번 예산 (C++) - binary search (0) | 2022.09.05 |
[백준] 1764번 듣보잡 (C++) - binary search, map (0) | 2022.01.19 |
[백준] 1654번 랜선 자르기 (C++) - binary search (0) | 2022.01.16 |
[백준] 2805번 나무 자르기 (C++) - binary search (0) | 2022.01.14 |