现在的位置: 首页 > 综合 > 正文

hdu 4870 Rating 2014 Multi-University Training Contest 1

2018年04月25日 ⁄ 综合 ⁄ 共 1154字 ⁄ 字号 评论关闭
//hdu 4870
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include <cmath>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
//每次会增加50分,达到1000分,相当于每次增加1分,达到20分。
//q=1-p dp[0]=1+p*dp[1]+q*dp[0]; 打一场比赛+以概率p变到1+以概率q变到0
//dp[1]=1+p*dp[2]+q*dp[0];
//let dp[0]=t[k]+dp[k]; t[k]是0到k的期望回合数
//dp[k]=1+p*dp[k+1]+q*dp[k-2] 代入dp[0]=t[k]+dp[k]得
//dp[0]-t[k]=1+p*(dp[0]-t[k+1])+q*(dp[0]-t[k-2])
//So t[k+1]=1/p+1/p*t[k]-(1/p-1)*t[k-2]
//边界条件:t[0]=0 t[1]=1/p t[2]=1/p+1/p^2//
//因为由前面dp的递推公式化简可得 dp[0]=1/p+dp[1]=t[1]+dp[1],dp[1]=1/p+1/p^2+dp[2]=t[2]+dp[2]
//两个账号时,每次都用较低分数的账号,所以变化状态是(0,0)->(0,1)->(1,1)->(2,1)->(2,2)...
//(0,0)->(0,1)期望的回合数是t[1]-t[0]
//(0,1)->(1,1)期望的回合数是t[1]-t[0]
//(1,1)->(2,1)期望的回合数是t[2]-t[1]
//(2,1)->(2,2)期望的回合数是t[2]-t[1]
//(18,18)->(18,19)期望的回合数是t[19]-t[18]
//(18,19)->(19,19)期望的回合数是t[19]-t[18]
//(19,19)->(20,19)期望的回合数是t[20]-t[19]
//the sum is: t[19]+t[20]-2*t[0]=t[19]+t[20]
double p;
double t[22];
int main()
{
   freopen("input.txt","r",stdin);
   while(scanf("%lf",&p)!=EOF)
   {
       t[0]=0;
       t[1]=1/p;
       t[2]=1/p+1/(p*p);
       for(int i=3;i<=20;i++)
       {
           t[i]=1/p+1/p*t[i-1]-(1/p-1)*t[i-3];
       }
       double ans=t[19]+t[20];
       printf("%lf\n",ans);
   }
    return 0;
}

抱歉!评论已关闭.