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;
}