CF-780B- The Meeting Place Cannot Be Changed

http://codeforces.com/problemset/problem/780/B.

x轴上有n个点,给出这些点的坐标和最大速度,点只能左右移动。

问 所有点到某一点时间最小,求到达该点的时间。

可以对时间进行二分。若时间长为t,则对某一点pos[i],它能到达的范围为pos[i]-time*speed[i],pos[i]+time*speed[i];对n个点所能达到的区域取并集,并且不断缩小时间。

若对时间t,n个点没有并集,则要增大时间,否则减小时间t。

eps取太小会超时。

#include<bits/stdc++.h>
#define maxn 600005
using namespace std;
const double eps=1e-6;
double pos[maxn],speed[maxn];
int n;
bool flag(double time)
{
    double left,right,lf,rf;
    for(int i=1;i<=n;i++)
    {
        if(i==1)
        {
            left=pos[i]-time*speed[i];
            right=pos[i]+time*speed[i];
        }
        else
        {
            lf=pos[i]-time*speed[i];
            rf=pos[i]+time*speed[i];
            if(lf>right||rf<left) return 0;
            left=max(lf,left);
            right=min(right,rf);
        }
    }
    return 1;
}


int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>pos[i];
    for(int i=1;i<=n;i++) cin>>speed[i];


    double l=0,r=1e9;
    while(r-l>eps)
    {
        double mid=(l+r)/2;
        if(flag(mid))
            r=mid;
        else
            l=mid;
    }
    printf("%.12lf\n",r);
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_38924883/article/details/82025164
今日推荐