题目描述
传送门
题意:某一个人,初始战斗值为f,面临着n条道路,每一条道路有一个困难程度ti,和锻炼值ci。每一天他会等概率地选择一条道路,如果他的战斗值大于ci,那么他会花费ti的天数走出去,否则他走不出去,但是战斗值增加ti。ti和ci的关系满足ti=floor((1+sqrt(5))*0.5*ci*ci)
给出n,f,ci,问这个人走出去的期望天数
题解
令f(i)表示战斗值为i时走出去的期望天数
令Max为ci中的最大值
因为战斗力可能超过Max,所以f(i)从Max*2开始
然后根据i和cj的关系转移
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,Max,c[105];
double t[105],f[30005];
void clear()
{
Max=0;
memset(c,0,sizeof(c));
memset(t,0,sizeof(t));
memset(f,0,sizeof(f));
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
clear();
for (int i=1;i<=n;++i)
{
scanf("%d",&c[i]),Max=max(Max,c[i]);
t[i]=(double)floor((1.0+sqrt(5.0))*0.5*(double)c[i]*(double)c[i]);
}
if (m>Max)
{
puts("1.000");
continue;
}
for (int i=Max*2;i>=m;--i)
for (int j=1;j<=n;++j)
if (i>c[j]) f[i]+=t[j]/(double)n;
else f[i]+=(f[i+c[j]]+1)/(double)n;
printf("%.3lf\n",f[m]);
}
}