DP<一维> 2058 龟兔赛跑

本文采用动态规划算法解决兔子与小龟赛跑问题,通过优化充电策略,判断兔子是否能跑赢小龟。关键在于计算到每个充电点的最短时间,并考虑电动车续航和充电效率。

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

题意:
知道兔子匀速跑步时间 v
小龟 骑电动车时间 v1 和蹬电动车时间v2..
知道总路程 l 电动车充满电可以维持路程c..
还有赛道上的充电器的数目 n 和每个充电器离原点的距离 ni..

问兔子能不能跑赢小龟..

 

思路:

dp[ ] 记录 到该充电点花费时间最小值..

然后对每一个充电点进行计算..

                          for     j 从 0 开始 到 i

                        计算 第 j 个點充满电后 到 第 i 个充电点花费的时间..

                         加上dp[ j ]..算出到第 i 个點的时间最优值..

Tips:

 初始状态: dp[0] = 0;

动态转移方程: dp[ i ] = min{dp[ j ] + t}

结果: dp[n+1]

PS:开始的时候是不用充电的..所以计算最少时间的时候..如果是从零点开始就不用算充电的时间..

         其中把dp[ n + 1] 设为终点..

Code:

#include <stdio.h>
#include <cstring>

int main()
{
    int i, j, k;
    int l, n, c, t;
    int v, v1, v2;
    int p[110];
    double dp[110];
    double tt, min;
    while(scanf("%d %d %d %d", &l, &n, &c, &t) != EOF)
    {
        scanf("%d %d %d", &v, &v1, &v2);
        dp[0] = p[0] = 0;
        for(i = 1; i <= n; ++i)
        scanf("%d", &p[i]);
        p[n+1] = l;

        for(i = 1; i <= n+1; ++i){
            min = 0xffffff;
            for(j = 0; j < i; ++j){
                int len = p[i] - p[j];
                tt = len>c?c*1.0/v1 + (len-c)*1.0/v2 : len*1.0/v1;
                tt += dp[j];
                if(j) tt+=t;
                if(min > tt) min = tt;
            }
            dp[i] = min;
        }
        puts(dp[n+1] < l*1.0/v?"What a pity rabbit!":"Good job,rabbit!");
    }
    return 0;
}


 

                       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值