题意:有个老司机开车,速度是一组非递减的序列,然后交警只记录了他的位置,问你,这个老司机要经过这些所有的位置最少需要的时间
思路:因为速度要么是不变,要么是递增的,所以经过最后一个位置的时候速度是最大的,又因为没有给出对速度的限制,所以我们就让司机经过最后一段距离的时间为一秒,所以最后一段的速度就是其长度,然后往前递推出前面的速度。又因为时间是个整数,但是速度不一定是个整数,所以这道题还要注意精度问题,就是每次用当前的路程除以速度,然后得到时间的整数,如果这个长度除以这个时间整数不能得到这个速度,那就时间加一,然后算出新的时间,更新时间和答案就行了。
P.S.一开始还以为速度为整数,然后还傻傻地想要用循环来更新时间,然后,不是超时就是WA,然后看了题解才知道,原来还可以是小数,不过也是,毕竟题目一直说的是实数和数字,并没有说是整数。

1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<vector> 7 #include<string> 8 #include<queue> 9 #include<map> 10 #include<stack> 11 #include<set> 12 #include<list> 13 #define ll long long 14 #define maxn 100100 15 #define PI acos(-1.0) //圆周率 16 const ll INF = 1e18; 17 using namespace std; 18 int T,n; 19 int num[maxn]; 20 int main() 21 { 22 int cas=0; 23 scanf("%d",&T); 24 while(T--) 25 { 26 scanf("%d",&n); 27 num[0]=0; 28 for(int i=1;i<=n;i++) scanf("%d",&num[i]); 29 30 ll ans=0; 31 double spe=num[n]-num[n-1]; 32 for(int i=n;i>0;i--) 33 { 34 double len=(num[i]-num[i-1])*1.0; 35 int t=len/spe; 36 ans+=t; 37 if(len/t!=spe) 38 { 39 ans++; 40 spe=len/(t+1); 41 } 42 } 43 44 printf("Case #%d: %lld ",++cas,ans); 45 } 46 47 return 0; 48 }