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\n",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\n",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\n",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\n",ma);
}