HDU 5935(贪心+卡精度)

题意:一辆车在路上直线走,它的速度是不减的,现在有一些该车路过的坐标,测的时刻是整数时刻,最后一个测值位置点是终点。问车开到终点的最少用时? 

思路:因为速度是匀速或递增的,所以要想用时最少,最后一段路程用时就为1,速度就是这段路程,然后往前递推求速度。有两种情况:(1)如果后一段速度>=前一段路程,说明前一段路程可以用时1完成;(2)如果后一段速度<前一段路程,说明前一段的速度不可能等于后一段,应该等于前一段路程/t,这里若路程是后一段速度的整数倍,则t=len/v,若路程不是后一段速度的整数倍,则t=len/v+1;这里判断double的整除用到了大佬的方法:只需要在做除法前-eps就可以实现了,因为对于double型我们认为[x-eps,x+eps]都是等于x的,那么如果对x减去一个eps则新的x属于[x-2eps,x],这样就可以判断是否要加1了。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int t,n,a[100005],cas=0;
int main()
{

    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        int ans=1;
        double v=1.0*(a[n]-a[n-1]);
        for(int i=n-1;i>=1;i--)
        {
            double len=1.0*(a[i]-a[i-1]);
            if(v>=len)
            {
                v=len;
                ans++;
            }
            else
            {
                int t=int((len-eps)/v)+1;
                v=len/t;
                ans+=t;
            }
        }
        printf("Case #%d: %d\n",++cas,ans);
    }
    return 0;
}

 

posted @ 2018-08-25 00:24  MCQ  阅读(218)  评论(0编辑  收藏  举报