题目大意:
人需要逃出地洞,每个地洞有自己的守卫者。守护者的战力为c[i]。
每天人会被随机的分配到一个地洞的出口前。
当人的战力值f>c[i]时花费天即可逃出。
否则,战力值加上c[i],天数加一,第二天随机出现在一个地洞口。
问逃出去的天数的期望值。
题目分析:
分类讨论
d[i]是武力值为i的时候逃出地洞需要天数的期望值。
1.i> c[j] , d[i] += floor(1+sqrt(5.0))/2 *c[i]^2/n
2.i <= c[j] ,d[i] +=(d(i+c[i])+1)/n
答案就是d[f]
#include <bits/stdc++.h>
using namespace std;
#define N 20005
double d[N];
double c[N];
double p = 0.5+sqrt(5.0)/2;
int n,f;
double dp(int tf){
//if(tf>N)tf = N-1;
if(d[tf]>0)return d[tf];
for(int i=0;i<n;i++){
if(tf>c[i]){
d[tf]+=floor(p*c[i]*c[i])/n;
}else {
d[tf]+=(dp(tf+c[i])+1)/n;
}
}
return d[tf];
}
int main(){
//std::ios::sync_with_stdio(false);
while(cin>>n>>f){
for(int i=0;i<n;i++){
cin>>c[i];
}
memset(d,0,sizeof(d));
printf("%.3f\n",dp(f));
}
}