题意
线段上有两个人,位置和速度分别是
。
求他们最短把线段覆盖(走)完的时间。
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) 
京公网安备 11010502036488号