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