Help Me Escape
题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808
题意: 师傅被妖怪抓走了。有n个妖怪,每个妖怪有一个固定的战斗力c[],师傅也有一个初始战斗力f0。
每天,师傅会随机选择一个妖怪决斗,如果打得赢ft>c[],就可以逃出去,逃出去要t[]天,毕竟超人不会飞;
否则,师傅会不甘心,当天他会拿出秘籍练功,将自己变强,f(t+1)=f(t)+c[],第二天寻找下一次机会。
问师傅能够逃脱可怕的妖怪,继续追求去印度吃手抓饼的梦想的天数的数学期望day。
解:
设dp[F]是战斗力为F时,逃离的天数期望。(答案是dp[f])。则有公式。 dp[F]= Σ 1/n * t[i] ,F>c[[i] +∑ 1/n * dp[F+c[i]] ,F<=c[i]
( 经典 题 好像)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; int n,m,i,sum,j,a[100000]; double t1,f[100000]; int main(){ t1=(1+sqrt(5))*0.5; while(~scanf("%d%d",&n,&m)){ sum=0; memset(f,0,sizeof(f)); for(i=1;i<=n;i++){ scanf("%d",&a[i]); sum=max(sum,a[i]); } for(i=sum*2;i>=m;i--){ for(j=1;j<=n;j++){ if(i>a[j])f[i]+=(int)(t1*a[j]*a[j]); else f[i]+=f[i+a[j]]+1; } f[i]/=n;///遇到妖怪的 概率 是 1 / n } printf("%.3f\n",f[m]);} }
一步一步,永不停息