-
백준 1072번(게임) c++백준 문제 2023. 3. 7. 14:46728x90
1072번: 게임
김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시
www.acmicpc.net
게임 횟수를 x라 하고, 이긴 게임을 y라고 하고 현재 승률을 z라고 할때 게임을 최소 몇번 더 해야 z가 변하는지 구하는 것이다.
예를 들어 x =10이고, y = 8이면 z = 80이다. 이때 게임을 1번 더하면 x =11, y =9이고, z = 81.xxx %이다.
따라서 최소 1번 더하면 z가 바뀐다.
게임은 항상 이긴다고 가정하자.
수식을 세워보자.
게임을 할 때 마다 무조건 승리하므로 승률은 올라갈 수 밖에 없다.
게임을 진행한 횟수를 k라 할 때 z+1을 구하면 된다.
z + 1 = 100 * (y + k) / (x + k)
=> (z + 1)(x + k) = 100 * (y + k)
=> zx + zk + x + k = 100y + 100k
=> zk + k - 100k = 100y - x - zx
=> (z - 99)k = 100y - (z + 1)x
=> k = (100y - (z + 1) / (z - 99)
이를 코드로 구현해주면 된다.
또한 조건이 있는데 만약 확률이 더이상 올라갈 수 없다면 -1을 출력하는 것이다.
처음부터 100%이면 승률이 올라갈 수없고 처음부터 99%이면 100%로 절대 올라갈 수 없다.
따라서 z가 99이상이면 바로 -1을 출력하면 된다.
double x, y; cin>>x>>y; double z = floor(100* y / x); //예를 들어 80.xxx이면 소수점을 버려야 하기 때문에 내림 if(z>=99){ cout<<-1; } else{ int ans = (int)ceil(((100*y)-((z+1)*x)) / (z-99)); cout<<ans; }
우리는 소수점까지 필요없으므로, ceil을 해주어서 답을 출력한다.
예를 들어 k = 3.451이면 3번을 이겨야 z가 바뀌는게 아니라 4번이겨야 z가 바뀌는 것이다.
전체 코드입니다.
#include<iostream> #include<string> #include<cstring> #include<sstream> #include<algorithm> #include<vector> #include<queue> #include<map> #include<math.h> #define INF 2000000000 using namespace std; using ll = long long; int main() { ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL); double x, y; cin>>x>>y; double z = floor(100* y / x); if(z>=99){ cout<<-1; } else{ int ans = (int)ceil(((100*y)-((z+1)*x)) / (z-99)); cout<<ans; } return 0; }
'백준 문제' 카테고리의 다른 글
백준 1202(보석 도둑) c++ (0) 2023.03.09 백준 3020(개똥벌레) c++ (0) 2023.03.08 백준 2342(Dance Dance Revolution) c++ (0) 2023.03.06 백준 11062(카드 게임) JAVA (0) 2023.02.17 백준 5582(공통 부분 문자열) (0) 2023.02.17