Code Forces 590 B. Chip 'n Dale Rescue Rangers(二分)

来源:互联网 发布:淘宝新店推广 编辑:程序博客网 时间:2024/04/30 16:53

Description
一架飞机需要从(x1,y1)飞到(x2,y2),飞机相对于风的最大飞行速度是v,风速在前ts为(vx,vy),之后变为(wx,wy),问飞机飞到目的地所花费的最少时间是多少(忽略飞机的变速时间)
Input
第一行为四个浮点数x1,y1,x2,y2分别表示起点和终点坐标,第二行两个整数v和t分别表示飞机相对于风的最大飞行速度以及风速(vx,vy)的持续时间,之后为四个浮点数vx,vy,wx,wy分别表示两个风速,保证vx^2+vy^2< v^2且wx^2+wy^2< v^2)
(|x1|,  |y1|,  |x2|,  |y2| ≤ 10 000,0 < v, t ≤ 1000)
Output
输出飞机到达目的地所花费的最少时间,结果需保证与正确答案的相对及绝对误差均不超过1e-6
Sample Input
0 0 5 5
3 2
-1 -1
-1 0
Sample Output
3.729935587093555327
Solution
二分最短时间x,换参考系为风,先算出飞机静止时相对于风运动xs后的位置(x3,y3),再通过判断(x2,y2)和(x3,y3)的距离d与v*x的关系来判断飞机是否可达即可
Code

#include<stdio.h>#include<math.h>double X1,Y1,X2,Y2,v,t,vx,vy,wx,wy;double dis(double x1,double y1,double x2,double y2){    return (double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}int check(double x){    double x3,y3;    if(x>t)    {        x3=X1+t*vx+(x-t)*wx;        y3=Y1+t*vy+(x-t)*wy;    }    else    {        x3=X1+x*vx;        y3=Y1+x*vy;    }    double d=dis(X2,Y2,x3,y3);    if(d<v*v*x*x) return true;    return false;}int main(){    while(~scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2))    {        scanf("%lf%lf%lf%lf%lf%lf",&v,&t,&vx,&vy,&wx,&wy);        double l=0,r=1e10;        int res=1e6;        while(res--)        {            double mid=(l+r)/2;            if(check(mid)) r=mid;            else l=mid;        }        printf("%.18lf\n",l);     }    return 0;}
0 0
原创粉丝点击