[BOJ #22353] 헤이카카오

tolelom·2022년 6월 27일
0

백준

목록 보기
4/6

문제 설명

문제 링크
끝말잇기를 몇 판 하려고 한다.
한 판 하는데 a분이 걸리고 이길 확률은 d%이다.
매 판 이길 확률은 전 판에 비해서 k% 만큼 증가한다고 할 때 끝말잇기를 하는데 걸리는 시간의 기댓값을 구하라

알고리즘

  1. 승률이 100%가 되기 전까지 다음을 반복하면 된다.
  2. i회차 반복문
    1. ans+=i회차까지진행될확률i회차에서이길확률i번플레이ans += i회차까지 진행될 확률 * i회차에서 이길 확률 * i번 플레이
    2. i+1회차까지진행될확률=i회차까지진행될확률(1i회차에서이길확률)i+1회차까지 진행될 확률 = i회차까지 진행될 확률 * (1 -i회차에서 이길 확률)
    3. i+1회차에서이길확률=i회차에서이길확률(1+k%)i+1회차에서 이길 확률 = i회차에서 이길 확률 * (1 + k\%)
    4. 반복

코드

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int a, d, k;
double accumulateProbability;
double winRate;
double ans;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    // init
    cin >> a >> d >> k;

    ans = 0;
    winRate = d / 100.0;
    accumulateProbability = 1.0;

    for (int i = 1; ; ++i) {
        if (winRate > 1.0) {
            ans += accumulateProbability * i;
            break;
        }

        ans += accumulateProbability * i * winRate;
        accumulateProbability = (accumulateProbability * (1 - winRate));
        winRate += winRate * (k / 100.0);
    }

    cout << fixed;
    cout.precision(7);
    cout << ans * a << '\n';

}

느낀 점...

간단한 확률 문제인데 확률 계산에 자꾸 실수가 있었다...
자꾸 풀어야 익숙하게 빨리 풀 수 있을 듯..?

profile
이것 저것 작성하는 기술 블로그

0개의 댓글