HDU 5935 Car 贪心

针对车辆在固定坐标间匀加速行驶的问题,本文介绍了一种求解车辆到达终点最短时间的算法。通过从终点反向推导,确保每段路程速度最大化,进而计算总耗时。

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

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5935
题意:一辆车在路上直线走,它的速度是不减的,现在有一些该车路过的坐标,测的时刻是整数时刻,最后一个测值位置点是终点(这一点题目没说,我觉得不严谨)。问车开到终点的最少用时?
解题思路:我们知道,由于时间是整数,车的速度是相等或递增的,那么我们尽量让车速最快。我们从最后一段路程入手,令车通过该段路程的时间为1,这样做的目的是使得车速最大,(因为时间是整数值,最小就是1了),使最后一段路程的速度最大的目的是为了最大化前面的所有路程的速度(因为车速是不递减的)。那么我们得到了最后一段路程的最大速度(其实就是长度len),往前递推前面的路程的速度和用时:
1)后一段路的最大速度v大于前一段路的路程长度len,那么我们继续用这个最大速度v走这前面的一段路,耗时最少,为1秒,同时也保持了最大速度。
2)后一段路的最大速度v小于前一段路的路程长度len
2.1) 若len是v的整数倍,则这段路耗时len / v
2.2)若len不是v的整数倍,则这段路程耗时len / v + 1
(对于double型如何判断倍数关系?其实只需要在做除法前-eps就可以实现了,因为对于double型我们认为[x-eps,x+eps]都是等于x的,那么如果对x减去一个eps则新的x属于[x-2eps,x],此时对结果取整就能实现不是整数倍时不加一的这个目的了)
AC代码:

#include<cstdio>
const int maxn = 100005;
int pos[maxn];
const double eps = 1e-8;
int main()
{
    int t,n;
    scanf("%d", &t);
    for (int m = 1; m <= t; m++)
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &pos[i]);
        double v = 1.0 * (pos[n]-pos[n-1]);
        int ans = 1;
        for (int i = n-1; i >= 1; i--)
        {
            double len = 1.0 * (pos[i] - pos[i-1]);
            if (v >= len-eps)
            {
                v = len;
                ans++;
            }
            else
            {
                double t = int((len-eps)/v) + 1;//-eps使得v整除len的时候值比不整除时少一
                v = len / t;
                ans += t;
            }
        }
        printf("Case #%d: %d\n",m,ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值