[ZHOJ1954]lyd的旅行

题目大意:
  一个做直线运动的物体已知初速度v0和v1,每分钟速度最大改变d,总共运动了t分钟,问至多运动了多少距离。(每个单位时间只能以同一种速度行驶)

思路:
  肯定是先尽可能加速再减速,我们可以想一个O(n)的贪心,从时间轴左右两端出发,然后每次在少的一端加上d,然后累加答案即可。
  观察发现这其实就是两个直线求交点,因此可以O(1)过。

 1 #include<cstdio>
 2 #include<cctype>
 3 inline int getint() {
 4     register char ch;
 5     while(!isdigit(ch=getchar()));
 6     register int x=ch^'0';
 7     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
 8     return x;
 9 }
10 int main() {
11     int v1=getint(),v2=getint(),t=getint(),d=getint();
12     int ans=v1+v2;
13     int l=1,r=t;
14     while(l+1<r) {
15         if(v1<v2) {
16             ans+=v1+=d;
17             l++;
18         } else {
19             ans+=v2+=d;
20             r--;
21         }
22     }
23     printf("%d\n",ans);
24     return 0;
25 }

 

posted @ 2017-09-27 10:29  skylee03  阅读(143)  评论(0编辑  收藏  举报