Help Me Escape

题目:
https://zoj.pintia.cn/problem-sets/91827364500/problems/91827369307

一只吸血鬼攻击力为 m m m,有 n n n条路给他走,每天他随机走一条路,每条路有个限制 c i c_i ci,如果当时这个吸血鬼的攻击力大于 c i c_i ci,那么就会花费 t i t_i ti天逃出去。否则,攻击力增加 c i c_i ci, 第二天继续选路。问他逃出去的期望天数。

思路:
f ( i ) f(i) f(i)表示攻击力为 i i i时逃出去的期望, f ( i ) = 0 f(i)=0 f(i)=0,对于所有的路,有
f ( i ) + = 1 n ∗ t j ( t j > i ) f ( i ) + = 1 n ∗ f ( i + t j ) ( t j ≤ i ) \begin{aligned} f(i)+=&\frac{1}{n}*t_j\quad(t_j>i)\\ f(i)+=&\frac{1}{n}*f(i+t_j)\quad(t_j\le i) \end{aligned} f(i)+=f(i)+=n1tj(tj>i)n1f(i+tj)(tji)
刚开始想的时候多了一维

#include<bits/stdc++.h>
using namespace std;
const int N=109;
double f[N][N*N],ans;
int n,m,c[N],t[N];
double dfs(int x,int y)
{
    if(y>c[x])
        return (double)t[x];
    if(f[x][y])
        return f[x][y];
    f[x][y]=1;
    for(int i=1; i<=n; i++)
        f[x][y]+=1.0/(double)n*dfs(i,y+c[x]);
    return f[x][y];
}
int main()
{

    while(scanf("%d%d",&n,&m)==2)
    {
        ans=0;
        memset(f,0,sizeof(f));
        for(int i=1; i<=n; i++)
            scanf("%d",&c[i]),t[i]=(int)((1+sqrt(5))/(double)2*c[i]*c[i]);
        for(int i=1; i<=n; i++)
            ans+=dfs(i,m)/n;
        printf("%.3lf\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值