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
",f[m]);
31     }
32     
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/gryzy/p/14428980.html