杭电2059--龟兔赛跑

题目描述:
这里写图片描述

解析:
使用动态规划思想建立模型,开始以为自己对动态规划已经很熟练了,做了这道题才发现,呵呵~还是得练!
废话不多说,这道题的思想如下:
想要求乌龟与兔子谁先到达终点,其实就是拿乌龟到达终点的最快速度与兔子的相比,因此我们设乌龟到达某一点最快的时间为dp[n],对于每过一个点,存在充电与不充电两种情况,因此我最初的想法是比较充电与不充电这两种情况的最短时间,作为dp[i]。然而真正写完才发现,不充电的情况下,还需要知道在这种情况下,乌龟从上一个点出发时电动车的电还能支持它走多远,很麻烦~
借鉴了网上的代码和思路,才发现自己的想法太刻板。如果能确定在最优解的情况下,最近一次充电是什么时候,就能知道相对的整体最优解。因此我们加一层循环来表示之前的某个点到i点的最短时间,通过比较得出dp[i],进而求出整体的最优解。
如果上一次充电的地点和这一次充电地点的距离比C要长,证明需要脚蹬,因此:

                if(a[i]-a[j]>c)
                    time=1.0*c/vt1+1.0*(a[i]-a[j]-c)/vt2;

否则的话,这两点间全程都可以以最快速度走完:

                else
                    time=1.0*(a[i]-a[j])/vt1;

同时考虑到初始站点并不需要充电,写出代码:

//杭电龟兔赛跑
#include<stdio.h>
#include<string.h>
#define MAXN 100005
#define min(a,b) (a<b?a:b)
int main()
{
    int l,n,c,t,i,j,k;
    int vr,vt1,vt2,cnt,a[MAXN];
    float dp[MAXN],time,timer;
    while(scanf("%d",&l)!=EOF&&l)
    {
        scanf("%d%d%d",&n,&c,&t);
        scanf("%d%d%d",&vr,&vt1,&vt2);
        dp[0]=a[0]=0;
        a[n+1]=l;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=1;i<=n+1;i++)
        {
            dp[i]=MAXN; 
            for(j=0;j<i;j++)
            {
                if(a[i]-a[j]>c)
                    time=1.0*c/vt1+1.0*(a[i]-a[j]-c)/vt2;
                else
                    time=1.0*(a[i]-a[j])/vt1;
                dp[i]=min(dp[i],dp[j]+time+t*(j>0));
            }
        }
        timer=(float)l/vr;
        if(timer<dp[n+1])
            printf("Good job,rabbit!\n");
        else
            printf("What a pity rabbit!\n");
    }
    return 0;
} 
好的,我可以为您介绍一下 Java 编写的龟兔赛跑模拟。 首先,我们需要定义两个角色——乌龟和兔子,他们的基本属性包括速度、位置等信息。可以用一个类来表示他们: ```java public class Animal { private String name; // 名称 private int speed; // 速度 private int position; // 位置 // 构造函数 public Animal(String name, int speed) { this.name = name; this.speed = speed; this.position = 0; } // 睡觉 public void sleep() { System.out.println(name + "在睡觉..."); } // 行动 public void move() { int distance = speed; // 行进距离等于速度 position += distance; // 更新位置 System.out.println(name + "跑了" + distance + "米,当前位置:" + position + "米"); } // 获取位置 public int getPosition() { return position; } } ``` 接下来,我们需要模拟比赛的场景。可以使用一个类来表示比赛,包括两个角色和比赛的逻辑: ```java public class Race { private Animal tortoise; // 乌龟 private Animal hare; // 兔子 // 构造函数 public Race() { tortoise = new Animal("乌龟", 5); hare = new Animal("兔子", 10); } // 开始比赛 public void start() { int totalDistance = 100; // 总距离 while (tortoise.getPosition() < totalDistance && hare.getPosition() < totalDistance) { tortoise.move(); hare.move(); if (hare.getPosition() - tortoise.getPosition() > 10) { tortoise.sleep(); // 兔子领先10米以上,乌龟睡觉 } } System.out.println("比赛结束,"); if (hare.getPosition() >= totalDistance && tortoise.getPosition() >= totalDistance) { System.out.println("双方同时到达终点,平局!"); } else if (hare.getPosition() >= totalDistance) { System.out.println("兔子获胜!"); } else { System.out.println("乌龟获胜!"); } } } ``` 最后,我们可以在 `main()` 函数中创建比赛对象并开始比赛: ```java public static void main(String[] args) { Race race = new Race(); race.start(); } ``` 这样,我们就成功地用 Java 编写了一个龟兔赛跑模拟程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值