1 条题解

  • 0
    @ 2025-8-24 21:31:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yangwenbin
    这个家伙不懒,什么也没有留下

    搬运于2025-08-24 21:31:17,当前版本为作者最后更新于2020-08-01 13:09:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题解 P1870 【公交车】

    还没有看过题的同学请走这(传送门

    是一个高中物理题

    要进行分类讨论

    所以以 X 与 V,a 的关系分类

    直接匀加速冲过终点

    如图

    设 初速度=V0,末速度=V,加速度=a,时间为t
    
    因为   :X = V0t + 1/2*a*t*t
    又因为 :V0 = 0
    所以   :X = 1/2*a*t*t
    又因为 :V = at
    所以   :t = V/a
    所以   :X = 1/2*V*V/a = V*V/(2*a) 
    

    所以此分类( X <= V * V/(2 * a))

    又因为:X = V*V/2*a
    又因为:X = a*t*t/2
    所以  :t*t = V*V/a*a
    又因为:V*V = 2*a*X
    所以  :t*t = 2*X/a
    所以  :t = sqrt(2*X/a)
    

    先匀加速,在匀速

    如图

    因为末速度均为V的匀加速运动运动相同的距离,比匀速直线运动多花费两倍的时间

    所以可以退出公式位:

    t = V*V+2aX/(2*a*V)
      = X/V + Y/2*a
    

    然后算出每个车的最小速度

    但是题目有要求

    不管有多大的马力,一辆公交车都不能超过其他另外的公交车,
    如果一辆公交车追上另一辆公交车,
    那么后面追上的车跟前面被追的车一起并排行驶同时到达终点站。
    当然司机都是尽可能快的驾车到达终点站的。
    

    所以要记录以前所有车到终点站时间的最大值

    如最大值比现在的值慢,把这辆车的时间设为最大值

    否则更新最大值

    if(maxn > ans){
    	ans=maxn;
    }else{
    	maxn=ans;
    }
    

    还有本题卡printf(四舍五入)

    若用printf输出%.4lf会自动四舍五入,所以要特殊处理

    先将结果乘以10000,再向下取整,然后/10000

    ans*=10000;
    ans=floor(ans);
    ans/=10000;
    

    code

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
    	double n,a,x;
    	double maxn=0.0000;
    	scanf("%lf %lf %lf",&n,&a,&x);
    	while(n--){
    		double t,v;
    		scanf("%lf %lf",&t,&v);
    		double ans = t;
    		if(x <= v*v/(2*a)){
    			ans += sqrt(2*x / a);
    		}else{
    			ans += x/v;
    			ans += v/(2*a);
    		}
    		if(maxn > ans){
    			ans=maxn;
    		}else{
    			maxn=ans;
    		}
    		ans*=10000;
    		ans=floor(ans);
    		ans/=10000;
    		printf("%0.4lf\n",ans); 
    	}
    }
    
    
    • 1

    信息

    ID
    839
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者