백준 문제

백준 1072번(게임) c++

kangyuseok 2023. 3. 7. 14:46
728x90

문제

 

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;
}