各种==0什么的临界条件多的很,所以先把所有的特殊状况判一遍,在正常之后再细心地模拟就好
傻逼地把k>=l和2*k>=l合成了一种情况
傻逼地被顺逆时针给绕晕了,包括点的顺序方式和bob、alice的移动方向。要清楚每个方向要怎么计算
代码有注释,自己看吧
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int main() { //freopen("input.txt", "r", stdin); int t; scanf("%d", &t); while (t--) { int l, xb, xa, vb, va, k; scanf("%d%d%d%d%d%d", &l, &xb, &xa, &vb, &va, &k); if (xb == xa)//不用追 { printf("0.00000\n"); continue; } if (k >= l)//alice 无法移动 { if (vb > 0) { int d1 = (xa - xb + l) % l, d2 = (xb - xa + l) % l; int m = d1 < d2 ? d1 : d2; double ans = m*1.0 / vb; printf("%.5f\n", ans); } else printf("Impossible\n"); continue; } if (va == 0)//alice 原地不动 { if (vb > 0) { int d1 = (xa - xb + l) % l, d2 = (xb - xa + l) % l; int m = d1 < d2 ? d1 : d2; double ans = m*1.0 / vb; printf("%.5f\n", ans); } else printf("Impossible\n"); continue; } if (vb == 0)//bob原地不动 alice追 { if (k == 0) { int d = (xb - xa + l) % l; double ans = d*1.0 / va; printf("%.5f\n", ans); } else printf("Impossible\n"); continue; } if (k == 0)//alice 看不见 { double ans, a1, a2; if (va >= vb) { int m = (xb - xa + l) % l; ans = m*1.0 / (va + vb); } else if (va < vb) { int m = (xa - xb + l) % l; a1 = m*1.0 / (vb - va); a2 = ((xb - xa + l) % l)*1.0 / (va + vb); ans = a1 < a2 ? a1 : a2; } printf("%.5f\n", ans); continue; } if (vb <= va)//alice会移动,也能看见,但是bob速度追不上alice,无法追上 { printf("Impossible\n"); continue; } if (2 * k >= l) { if ((xb - xa + l) % l>k) { double ans = ((xa - xb + l) % l)*1.0 / (vb - va); printf("%.5f\n", ans); } else if ((xa - xb + l) % l>k) { double ans = ((xb - xa + l) % l)*1.0 / (vb - va); printf("%.5f\n", ans); } else { int k1 = (xa + k + l) % l; int k2 = (xa - k + l) % l; int d1 = (k1 - xb + l) % l; int d2 = (xb - k2 + l) % l; double ans = 0; if (d1 < d2) ans += d1*1.0 / vb; else ans += d2*1.0 / vb; ans += (l - k)*1.0 / (vb - va); printf("%.5f\n", ans); } } else { if (((xb - xa + l) % l) <= k) { int m = (xb - xa + l) % l; double ans = m*1.0 / (vb - va); printf("%.5f\n", ans); continue; } double a1 = 0, a2 = 0; a1 = ((xb - xa + l) % l - k)*1.0 / (va + vb) + k*1.0 / (vb - va); a2 = ((xa - xb + l) % l)*1.0 / (vb - va); double ans = a1 < a2 ? a1 : a2; printf("%.5f\n", ans); } } //system("pause"); //while (1); return 0; }