Codeforces 703C Chris and Road 二分、思考

题目:http://codeforces.com/contest/703/problem/C

题意:
这里写图片描述

一个人从(0,0,)到(0,w)速度最快是u。
一个凸多边形的物体(有n个顶点)与人同时开始移动,问人在不被撞的前提下最快到达(0,w)的时间?

分析:

人不被车撞,有两种情况,第一种是车在到达x=0时,人就已经过去了,这种情况特殊判断一下即可。第二种情况是人如果一直走可鞥会被车撞,要想不被车撞就是等车上的点都走到x=0左边的时候再过。要花费时间最少,那么二分即可,二分保证车的所有顶点到x=0花费的时间不大于人到该点花费的时间(也就是说人到该点时,车上的点都走到了x=0的左边,这样就不会撞人了)。

#include<bits/stdc++.h>
using namespace std;
typedef double db;
#define x first
#define y second
typedef pair<double,double>pdd;
const int N=1e5+9;
pdd p[N];
int n;
double u,v,w;
bool check()
{
    for(int i=0;i<n;i++){
        if(p[i].x/v<p[i].y/u)return 0;
    }
    return 1;
}
bool ok(double x)
{
    for(int i=0;i<n;i++){
        if(p[i].x/v>p[i].y/u+x)return 0;
    }
    return 1;
}
int main()
{
    scanf("%d%lf%lf%lf",&n,&w,&v,&u);
    for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
    if(check())printf("%.12lf
",w/u);
    else{
        double l=0,r=2e9;
        while(r-l>1e-9){
            double m=(l+r)/2;
            if(ok(m))r=m;
            else l=m;
        }
        printf("%.12lf
",w/u+(l+r)/2);
    }
    return 0;
}

cf大牛的解法,跟上边我说的思想是一样的,要保证人到某点时,车走到x=0左边:

void solve() {
    int i,j,k,l,r,x,y; string s;

    cin>>N>>W>>V>>U;
    FOR(i,N) cin>>X[i]>>Y[i];
    X[N]=X[0];
    Y[N]=Y[0];
    int up=0,down=0;
    FOR(i,N) {
        if(Y[i]*V-X[i]*U>0) up++;
        if(Y[i]*V-X[i]*U<0) down++;
    }

    if(up==0 || down==0) return _P("%.12lf
",W/1.0/U);
    double ma=0;
    FOR(i,N) if(X[i]>=0) ma=max(ma,max(X[i]*1.0/V,Y[i]*1.0/U) + (W-Y[i])*1.0/U);
    _P("%.12lf
",ma);
}
原文地址:https://www.cnblogs.com/01world/p/5762812.html