龟兔赛跑

题目:

hdoj :http://acm.hdu.edu.cn/showproblem.php?pid=2059

转载一位大牛写的代码。

链接:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=13573&messageid=1&deep=0

思路及AC代码:

/*
这道题目是DP中多阶段决策的典型例题
我们将起点和终点划分到N个加电站中去
这样一共有N+2点,用DP[i]表示到第i个加电站的最小耗费时间
那么在求DP[i]的时候,DP[0]...DP[i-1]已经求得
让j从0遍历到i-1,每一个j表示最后一次充电到i点
那么状态转移方程为
DP[i] = min(DP[j] + t(j, i)) //t(j, i)表示从j充完电一直到i点(中途没有充过电)
*/
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<iomanip>
const int MAX=150;
const double INF=0xfffff;//0x代表十六进制
double DP[MAX];//DP[i]表示到第i个加电站的最小耗费时间
int s[MAX];//s[i]表示到第i个加电站距离起点的距离
using namespace std;
double Min(double x,double y)//判断大小
{
    return x>y?y:x;
}
int main()
{
    double L;
    int n,i,j;
    double electricity_l,electricity_t;
    double vt_rabbit,vt_ele,vt_none;
    double len,sum,Time;
    while(cin>>L)//输入跑道长度
    {
        cin>>n>>electricity_l>>electricity_t;//输入加电站的个数、电动车最大行驶距离、电动车的充电时间
        cin>>vt_rabbit>>vt_ele>>vt_none;//输入兔子、电动车、乌龟用脚踏的各个速度
        for(i=1;i<=n;i++)//输入各个加电站距离起点的位置
        cin>>s[i];
        s[n+1]=L;//把第n+1个加电站设为终点,长度为L
        s[0]=0;//把第0个加电站设为起点,长度为0
        DP[0]=0;//起点到起点最小耗费时间为0
        for(i=1;i<=n+1;i++)
        {
            DP[i]=INF;//因为到第i个加电站最小耗费时间未知所以赋值无穷大
            for(j=0;j<i;j++)
            {
                len=s[i]-s[j];//从第j个加电站到第i个加电站的距离
                if(len>electricity_l)//如果该距离大于电动车能行驶的最大距离
                Time=electricity_l/vt_ele+(len-electricity_l)/vt_none;//把电动车行驶的时间加上乌龟用脚踏的时间
                else//如果小于
                Time=len/vt_ele;//直接加上这段距离除于电动车的速度所得的时间
                Time+=DP[j];//之后加上到第j个加电站的最优时间
                if(j>0)//这里判断j>0是因为如果j==0的话,即表明从起点出发,因为起点已经充满电了所以不需要加上电动车的充电时间
                {
                    Time+=electricity_t;//如果j>0加上电动车的充电时间
                }
                DP[i]=Min(DP[i],Time);//每次挑出到第i个加电站的最优时间
            }
        }
        if(DP[n+1]<(L/vt_rabbit))//如果乌龟从起点到终点最小时间小于兔子的跑到终点的时间
        cout<<"What a pity rabbit!"<<endl;
        else
        cout<<"Good job,rabbit!"<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scratch是一款教育性编程软件,它通过图形化编程方式帮助学生学习编程知识。在Scratch中,我们可以利用素材和代码来创建各种有趣的项目,其中包括了龟兔赛跑。 首先,我们需要准备龟兔赛跑素材。在Scratch中,我们可以选择预设的龟兔精灵或者自己上传自定义的龟兔精灵。对于一个龟兔赛跑项目,我们需要一只乌龟和一只兔子两个精灵。 接下来,我们可以创建舞台,并设计赛道。舞台可以是一个绿色的草地,赛道可以是两条不同颜色的线。可以使用Scratch提供的绘图功能,在舞台上绘制出一条赛道。 然后,我们需要编写代码来实现龟兔赛跑的逻辑。为了让龟兔能够在赛道上移动,我们可以利用Scratch提供的运动积木块来移动精灵。例如,我们可以利用前进和后退积木块来控制它们的移动速度和方向。 我们还可以为乌龟和兔子添加一些特殊效果,使得比赛更加有趣。例如,我们可以添加一个计时器来记录比赛的时间,并且在比赛结束时显示出来。我们还可以设计一些障碍物,让乌龟和兔子在赛跑过程中遇到一些挑战。 最后,我们需要设置比赛的规则和结束条件。例如,比赛可以是跑到终点线的先到者获胜,或者是谁先跑完指定的距离。 总之,通过Scratch,我们可以利用素材和代码来创作一个有趣的龟兔赛跑项目。这不仅可以帮助学生学习编程,还能培养他们的逻辑思维和创造力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值