您的位置:首页 > 其它

Codeforce 327D 二分

2016-03-19 16:40 190 查看
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps = 1e-7;
double X1, Y1, X2, Y2, Vmax, t, Vx1, Vy1, Vy2, Vx2;
bool check(double mid)
{
double X = X2, Y = Y2, D = Vmax * mid;
if (mid >= t)
{
X -= Vx2 * (mid - t) + Vx1 * t;
Y -= Vy2 * (mid - t) + Vy1 * t;
}
else
{
X -= Vx1 * mid;
Y -= Vy1 * mid;
}
if ((X - X1) * (X - X1) + (Y - Y1) * (Y - Y1) <= D * D) return true;
else return false;
}
int main(int argc, char const *argv[])
{
while (~scanf("%lf%lf%lf%lf", &X1, &Y1, &X2, &Y2))
{
scanf("%lf%lf", &Vmax, &t);
scanf("%lf%lf%lf%lf", &Vx1, &Vy1, &Vx2, &Vy2);
double l = 0, r = 1e9, mid = (l + r) / 2;
while (r - l >= eps)
{
if (check(mid)) r = mid;
else  l = mid;
mid = (l + r) / 2;
}
printf("%.7lf\n", r);
}
return 0;
}


最大的难度在于英语。。。。。。

从A点坐飞船到B点,飞船相对空气飞行的最大速度为vmax,速度大小方向可以随时改变.天气预报说今天有大风,t时刻前风向及大小用向量(ux,uy)表示,而t时刻之后转变为(vx,vy).当飞船相对空气静止时,在风(wx,wy)作用下将以(wx,wy)的速度运动.也就是说,实际速度向量是飞船速度向量和风速合成的结果. 问,至少需要多少时间才能从A点到达B点.

已知时间大于Vmax时,必然到达。那么显然就是二分或者三分。

恩,需要一些物理上的小技巧,把相对地面坐标系换成相对风,这样就简单多了。

确定B点在反向风力下运动t′时间(注意风向在t时刻改变)后的位置,而这段时间内飞船能到达的位置与飞船距离不超过t′∗vmax,也就是说只要判断运动t′时间后的B点到飞船的距离是否不超过t′∗vmax即可确定飞船能否在t′时间内从A点出发到达B点.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: