2cm

题目戳这

题意:有个老司机开车,速度是一组非递减的序列,然后交警只记录了他的位置,问你,这个老司机要经过这些所有的位置最少需要的时间

思路:因为速度要么是不变,要么是递增的,所以经过最后一个位置的时候速度是最大的,又因为没有给出对速度的限制,所以我们就让司机经过最后一段距离的时间为一秒,所以最后一段的速度就是其长度,然后往前递推出前面的速度。又因为时间是个整数,但是速度不一定是个整数,所以这道题还要注意精度问题,就是每次用当前的路程除以速度,然后得到时间的整数,如果这个长度除以这个时间整数不能得到这个速度,那就时间加一,然后算出新的时间,更新时间和答案就行了。

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\n",++cas,ans);
45     }
46 
47     return 0;
48 }
View Code

 

posted on 2016-10-30 21:05  2cm  阅读(504)  评论(0)    收藏  举报