您的位置:首页 > 其它

CDOJ 1035 Bob and Alice 神tm烦的分情况讨论

2016-03-21 15:11 363 查看
各种==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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: