原题链接
题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少
总体分为3种:
1、由某一个人走完全程。
2、两人对着走,直到两人都走到头。
(若先走到头的人往回走想在另一个人走到他的终点前走到那个点,则就是第一种情况)
3、二分p1和p2之间的中间点,中间点左边的由p1走完,中间点右边的由p2走完。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const double eps = 1e-6;
double p1, v1, p2, v2, n;
double ans;
double tim(double p, double v) {
return p / v;
}
double check(double mid) {
double t1 = tim(min(p1, mid - p1) + mid, v1);
double t2 = tim(min(n - p2, p2 - mid) + n - mid, v2);
ans = min(ans, max(t1, t2));
return t1 - t2;
}
int main() {
int T;
cin >> T;
while (T --) {
cin >> n >> p1 >> v1 >> p2 >> v2;
if (p1 > p2) swap(p1, p2), swap(v1, v2);;
ans = 1e10;
//由一个人走完全程
ans = min(ans, tim(min(p1, n - p1) + n, v1));
ans = min(ans, tim(min(p2, n - p2) + n, v2));
//两人相向走,分别走到面对的端点花费的总时间
ans = min(ans, max(tim(n - p1, v1), tim(p2, v2)));
//枚举两个人相遇的中间点,中间点左边的有p1走完,右边的由p2走完
double l = p1, r = p2;
for (int i = 0; i < 200; i ++) { //不用while,防止卡精度
double mid = (l + r) / 2;
if (check(mid) < 0) l = mid;
else r = mid;
}
printf("%f\n", ans);
}
return 0;
}