백준 1072번(게임) c++
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;
}