zoj3640 Help Me Escape
Help Me Escape
题意:
某一个人,初始战斗值为f,面临着n条道路,每一条道路有一个困难程度ti,和锻炼值ci。每一天他会等概率地选择一条道路,如果他的战斗值大于ci,那么他会花费ti的天数走出去,否则他走不出去,但是战斗值增加ti。ti和ci的关系满足ti=floor((1+sqrt(5))*0.5*ci*ci)
给出n,f,ci,问这个人走出去的期望天数
————————————————————————————————
期望DP
f[i]:以i的战斗值,几天可以走出
所有的道路的概率是一样的,那么就是1/n
所以只要循环判断当前道路是否小于给定战斗值,如果是就增加t[道路]/n
如果不是则要按照f[i+c[道路]]计算,注意,这需要增加一天!!!
————————————————————————————————
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e4+10; 4 int n,m; 5 double f[maxn*2]; 6 int c[maxn],t[maxn]; 7 int main() 8 { 9 while(scanf("%d%d",&n,&m)==2) 10 { 11 int mx=0; 12 memset(f,0,sizeof f); 13 for(int i=1;i<=n;++i) 14 { 15 scanf("%d",&c[i]); 16 t[i]=floor((1+pow(5,0.5))*c[i]*c[i]/2); 17 mx=max(c[i],mx); 18 } 19 if(mx<m) 20 { 21 puts("1.000"); 22 continue; 23 } 24 for(int i=mx*2;i>=m;--i) 25 for(int j=1;j<=n;++j) 26 { 27 if(c[j]<i)f[i]+=t[j]/(double)n; 28 else f[i]+=(f[i+c[j]]+1)/(double)n; 29 } 30 printf("%.3lf\n",f[m]); 31 } 32 33 return 0; 34 }