P1870公交车题解

· · 题解

是这是一道比较好的题目(俺只是一个蒟蒻),建议大家先理解题目,摸清公式,不然根本下不了笔呀! 根据某加速度公式,在这里,我们用 1 来表示车末时速度,用 0 来表示车初时速度:V _ {1}\times V _ {1}-V _ {0}\times V _ {0}=2\times a(加速度)\times s(路程) 但是,疑问又来了,题目中的路程(也就是 d)可能会小于 s(也就是均匀加速时行驶的路程),那么,我们就得分清楚两种情况。下面先插上一个公式:t(用匀加速度行驶某个路程时用的时间)=\sqrt{(2\times\frac{s}{a})} 有了这个公式就好办了,下面在代码中讲述两种情况。

Code

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
using namespace std;
double t,v;
double maxn=0.0;
int main()
{
    double a,n,d;
    cin>>n>>a>>d;
    for(int i=1;i<=n;i++)
    {
        cin>>t>>v;
        double ans=v*v*1.0/(2*a);//ans是匀加速时可行的最大路程
        if(ans>=d)t+=sqrt(2*1.0*d/a);//第一种情况:总路程不大于ans 那么时间可以根据上述公式得出
        else //第二种情况:总路程大于ans,也就是行驶过程中既要匀加速,又要匀速行驶
        t+=(sqrt(2*ans/a)+(d-ans)/v);//首先,根据公式得出匀加速时行驶的时间;其次,得出匀速行驶时的时间
        if(t>=maxn)//因为任何一辆公交都不能超过另一辆,所以用maxn来解决
            maxn=t;
        else
            t=maxn;
        t=floor(t*10000*1.0)/10000;//不要忘了精度问题
        printf("%0.4lf\n",t); //要注意,这里用setprecision(4)好像过不了。呜呜~~
    }
    return 0;//终于结束了
}