题意
线段上有两个人,位置和速度分别是。
求他们最短把线段覆盖(走)完的时间。
Solution
#include <bits/stdc++.h> using namespace std; inline double ct(double x, double pos, double v) { //当前处于pos,要覆盖[0,x],速度v的最短时间 return (min(pos, x - pos) + x) / v; } int main() { int t; scanf("%d", &t); while (t--) { double n, p1, v1, p2, v2; scanf("%lf%lf%lf%lf%lf", &n, &p1, &v1, &p2, &v2); if (p1 > p2) { // 按左右排序 swap(p1, p2); swap(v1, v2); } // 情况1 : 一个人走完所有 double ans = min(ct(n, p1, v1), ct(n, p2, v2)); // 情况2 : 对穿 ans = min(ans, max((n - p1) / v1, p2 / v2)); // 情况3 : 在两者之间找一个点,一人负责一边 double left = p1, right = p2; for (int i = 0; i < 100; i++) { double mid = (left + right) / 2; double time_left = ct(mid, p1, v1); double time_right = ct(n - mid, p2 - mid, v2); ans = min(ans, max(time_left, time_right)); if (time_left > time_right) { right = mid; } else { left = mid; } } printf("%.10f\n", ans); } return 0; }
python被卡的死死的
def tm(x, p, v): return min((x + p), (x - p) + x) / v T = int(input()) for _ in range(T): n, p1, v1, p2, v2 = map(float, input().split()) if p1 > p2: p2, p1 = p1, p2 v2, v1 = v1, v2 # situation 1 ans = min(tm(n, p1, v1), tm(n, p2, v2)) # situation 2 ans = min(ans, max((n - p1) / v1, p2 / v2)) # situation 3 L = p1 R = p2 for _ in range(100): mid = (L + R) / 2 tl = tm(mid, p1, v1) tr = tm(n - mid, n - p2, v2) ans = min(ans, max(tl, tr)) if tl > tr: R = mid else: L = mid print(ans)