[ZOJ 3054] Whirlwind [模拟]

18 篇文章 0 订阅
9 篇文章 0 订阅

在真三国无双里,关羽追杀敌人,关羽的移动速度是v1,敌人的移动速度是v2,两人的初始距离为d,关羽的技能范围为r,持续时间为t2,在一开始关羽就使用了技能,若敌人在技能范围内累计t1时间,则敌人就会被杀死。关羽还有一个一次性物品,可以让敌人的移动速度减半,持续t3时间。关羽不会越过敌人,如果关羽追上了敌人并且移动速度大于敌人,我们可以认为关羽和敌人一直处于一个点上。

分情况讨论...情况比较多...

1. 关羽比敌人跑的快或相等,且敌人开始就在攻击范围内,则不需要使用物品

2. 关羽比敌人跑的快或相等,且敌人开始不在攻击范围内,则一开始就使用物品

3. 关羽比敌人跑的慢,且敌人开始不在攻击范围内,则一开始就使用物品

4. 关羽比敌人跑的慢,且敌人开始在攻击范围内,则等敌人跑到距离关于为r的时候,再使用物品

5. 关羽比敌人跑到慢,且敌人开始在攻击范围内,且敌人速度的一半还比关羽的速度快,则一开始就使用物品。

#include <cstdio>

const double eps=1e-9;

double d,r,t1,t2,t3,v1,v2;

int main() {
	int t;
	scanf("%d",&t);
	while (t--) {
		scanf("%lf%lf%lf%lf%lf%lf%lf",&d,&r,&t1,&t2,&t3,&v1,&v2);
		if (v2<v1-eps) {
			if (d<=r+eps) {
				if (t1<=t2+eps) printf("yes\n");
				else printf("no\n");
			} else {
				double dd=t3*(v1-v2/2);
				if (d-dd>r+eps) {
					double time1=t3+(d-dd-r)/(v1-v2);
					if (time1+t1<=t2+eps) printf("yes\n");
					else printf("no\n");
				} else {
					double time1=(d-r)/(v1-v2/2);
					if (time1+t1<=t2+eps) printf("yes\n");
					else printf("no\n");
				}
			}
		} else if (v2<v1+eps) {
			if (d<=r+eps) {
				if (t1<=t2+eps) printf("yes\n");
				else printf("no\n");
			} else {
				double dd=t3*(v1-v2/2);
				if (d-dd-eps>r) {
					printf("no\n");
				} else {
					double time1=(d-r)/(v1-v2/2);
					if (time1+t1<=t2+eps) printf("yes\n");
					else printf("no\n");
				}
			}
		} else {
			if (d<=r+eps) {
				double time2=(r-d)/(v2-v1);
				if (v1-v2/2>eps) {
					time2+=t3;
					double dd=t3*(v1-v2/2);
					if (dd>r-eps) dd=r;
					time2+=dd/(v2-v1);
				} else if (v1-v2/2>-eps) {
					time2+=t3;
				} else {
					time2=(r-d)/(v2/2-v1);
					if (time2>t3+eps) {
						time2=t3+(r-d-t3*(v2/2-v1))/(v2-v1);
					}
				}
				if (time2>t2) time2=t2;
				if (time2>=t1-eps) printf("yes\n");
				else printf("no\n");
			} else {
				if (v1-v2/2<=eps) printf("no\n");
				else {
					double dd=t3*(v1-v2/2),time1,time2;
					if (dd+r<d-eps) printf("no\n");
					else {
						time1=(d-r)/(v1-v2/2);
						if (dd>d-eps) dd=r;
						else dd=dd-d+r;
						time2=t3+dd/(v2-v1);
						if (time2>t2) time2=t2;
						if (time2-time1>=t1-eps) printf("yes\n");
						else printf("no\n");
					}
				}
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值