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

各种==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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值