어읽로꾸거
BOJ 14613 너의 티어는? 본문
링크
https://www.acmicpc.net/problem/14613
14613번: 너의 티어는?
규환이는 최근에 오버워치에 흠뻑 빠졌다. 그의 랭크 점수는 현재 2000점이며, 그는 오늘 랭크게임을 20번 할 예정이다. 규환이는 게임을 시작하기 전 자신의 그동안 승률을 통해 자신이 브론즈, 실버, 골드, 플래티넘, 다이아에 갈 확률이 몇 퍼센트인지 궁금해졌다. 게임을 이길 경우 얻는 포인트는 50 Point, 질 경우 잃는 포인트도 50 Point, 비길 경우 Point의 변화는 없다. 랭크 점수에 따른 티어는 아래와 같다. 브론즈: 1000~149
www.acmicpc.net
풀이
조합(!)을 이용하여 확률을 계산하려 했으나. 오버플로우 문제를 생각안하고 (안푼지 오래되서 전혀 생각을 못함) 그냥 풀었다가 다시 정신을 차리고 DP로 풀었음.
코드
#include<stdio.h>
int main()
{
//freopen("input.txt","r",stdin);
double w_r, l_r, d_r;
double b, s, g, p, d;
double dp[21][41];
int score;
b = s = g = p = d = 0.0;
scanf("%lf %lf %lf", &w_r, &l_r, &d_r);
for(int i=0; i<=40; i++){
dp[0][i]=0;
}
dp[0][20]=1;
//i = played game
//j = rank
for(int i = 1; i <= 20; i++){
for(int j = 0; j <= 40; j++){
if(j==0)
dp[i][j] = (dp[i-1][j+1]*l_r);
else if(j==40)
dp[i][j] = (dp[i-1][j-1]*w_r);
else
dp[i][j] =
(dp[i-1][j+1] * l_r) +
(dp[i-1][j] * d_r) +
(dp[i-1][j-1] * w_r);
}
}
for(int i = 0; i < 10; i++)
b += dp[20][i];
for(int i=10; i < 20; i++)
s += dp[20][i];
for(int i=20; i < 30; i++)
g += dp[20][i];
for(int i=30; i < 40; i++)
p += dp[20][i];
d = dp[20][40];
printf("%.8lf\n%.8lf\n%.8lf\n%.8lf\n%.8lf\n",b,s,g,p,d);
}
'알고리즘' 카테고리의 다른 글
BOJ 15647 로스팅하는 엠마도 바리스타입니다 (0) | 2019.09.19 |
---|---|
BOJ 3187 양치기 꿍 (0) | 2019.09.15 |
BOJ 1038 감소하는 수 (0) | 2019.09.15 |
BOJ 17141 연구소 2 (0) | 2019.09.13 |
BOJ 6186 Best Grass (0) | 2019.04.23 |