관리 메뉴

어읽로꾸거

BOJ 14613 너의 티어는? 본문

알고리즘

BOJ 14613 너의 티어는?

어읽로꾸거 2019. 9. 15. 08:58

링크

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