[ZHOJ1954]lyd的旅行

本文介绍了一种求解直线运动中物体能到达的最大距离的算法。通过在给定时间内尽可能地加速和减速来实现距离最大化,采用贪心策略并结合两直线交点的几何特性实现了O(1)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
  一个做直线运动的物体已知初速度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 }

 

转载于:https://www.cnblogs.com/skylee03/p/7600406.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值