ZOJ 3640 Help Me Escape

本文介绍了一道在线编程竞赛题目“逃出洞穴”的解决方案。问题描述为:给定n条不同难度的路径及初始战斗力,求逃出洞穴所需的期望天数。文章提供了详细的算法思路及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OJ题目:click here~~

题目分析:有n条路径逃出洞穴,第i条路径有一个难度值ci。某人开始有战斗值f,每天随机选择某一条路径想要逃出。只要此时的 f 大于所选路径的ci,就能花费ti的天数逃出。这里。否则,等待明天再试吧,但是战斗值能增加ci。求逃出的期望天数。

设dp[ i ] 为战斗值为i时,逃出的期望天数。详细解释见代码。

AC_CODE

const int maxn = 102;
const double eps = 1e-8;
double t[maxn];
int c[maxn];
double dp[20002];
int n , m ;
int vis[20002];
double dfs(int x){
    if(!(fabs(dp[x]) < eps)) return dp[x];
    int i , j , k;
    double f = 0;
    for(i = 1;i <= n;i++){//每天随机的选择某个路径
        if(c[i] < x) f += t[i];//如果战斗值>c[i] , 则需要花t[i]的天数逃出
        else f += (1 + dfs(x + c[i]));//否则,这天战斗值加c[i],等待第二天选择吧
    }
    return dp[x] = f/n;//选择每条路径的概率都是1/n
}


int main()
{
    int i , j , k ;
    while(cin >> n >> m){
        for(i = 1;i <= n;i++)
            scanf("%d",&c[i]);
        for(i = 1;i <= n;i++)
            t[i] = (int)((1 + sqrt(5.0))*0.5*c[i]*c[i]);//根据公式计算天数,强制类型转换为int,去掉小数部分,功能等于floor
        memset(dp , 0 , sizeof(dp));
        printf("%.3lf\n",dfs(m));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值