题目描述
反重力技术的发现改变了世界。反重力鞋(Grav鞋)的发明使人们能够在空中自由飞翔。这导致了一项新的空中运动的兴起:“飞行马戏(Flying Circus)”。 参赛者穿着反重力鞋和飞行服进行比赛。比赛是在一个特定的场地内,并要求参赛者在特定的时间内争取得分。比赛场地是一个边长为 300 米的正方形,在正方形的四个角都漂浮着浮标,而这四个浮标按顺时针顺序编号为 1, 2, 3, 4。
图 1
两名选手从 浮标#1 开始比赛。比赛开始后,他们就按顺时针顺序触碰四个浮标。(因为 浮标#1 是起点,所以他们要触碰的第一个浮标是 浮标#2,此后,他们要按序触碰 浮标#3,#4,和#1)。这里要注意,他们可以在比赛场地内自由飞行,甚至可以在正方形场地的中央飞行。
在以下两种情况下,选手可以得一分。
- 如果你比你的对手先触碰一个浮标,你将得一分。例如,在比赛开始后,如果你的对手比你先触碰了 浮标#2,那么他得一分;而到你触碰到 浮标#2 的时候,你就不会得分。同时注意,在 触碰浮标#2 之前,你不能触碰 浮标#3 或任何其他浮标。
- 不考虑浮标得分,而是靠格斗得分。如果你和你的对手在相同位置遭遇,你可以和你的对手进行一场格斗来得一分。考虑到游戏的平衡性,在 浮标#2 被触碰之前,两名选手不得格斗。
通常,有三种类型的选手: Speeder:这类选手擅长高速运动,他们会尽量通过触碰浮标来得分,而尽量避免格斗。 Fighter:这类选手擅长格斗,他们会尽量通过和对手格斗来得分,因为Fighter的速度比Speeder慢,所以如果对手是一个Speeder,则Fighter很难通过触摸浮标来得分。 All-Rounder:综合了Fighter和Speeder的平衡型选手。 现在,在Asuka(All-Rounder选手)和Shion(Speeder选手)之间将进行一场训练赛。由于这场比赛只是一场训练赛,所以规则很简单:任何人触碰浮标#1后,比赛结束。Shion是Speeder选手,他的策略非常简单:沿最短路径触碰浮标#2、#3、#4、#1。 Asuka擅长格斗,所以她和Shion格斗就会得1分,而对手在格斗之后会昏迷 T
秒。由于Asuka的速度比Shion慢,她决定在比赛中只和Shion格斗一次。本题设定,如果Asuka和Shion同时触碰浮标,则Asuka得分,并且Asuka还可以与Shion在浮标处格斗。本题设定,在这种情况下,格斗是发生在浮标被Asuka或Shion触碰之后。 Asuka 的速度是V1
米/秒,Shion的速度是V2
米/秒。请问Asuka是否有赢的可能?
输入输出格式
输入格式 输入的第一行给出整数 t(0<t≤10000),然后给出 t 行,每行给出 3 个双精度变量 T,V1,V2(0≤V1≤V2,T≥0)
,表示一个测试用例。
输出格式 如果存在Asuka赢下比赛的策略,则输出 Yes
,否则输出 No
。
输入输出样例1
输入
2
1 10 13
100 10 13
输出
Case #1: No
Case #2: Yes
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int>PI;
const int N=1e5;
const double eps=1e-5;
const LL mod=1e9+7;
int main()
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
double t,v1,v2;
scanf("%lf%lf%lf",&t,&v1,&v2);
printf("Case #%d: ",ca++);
if(v1==v2)
{
puts("Yes");
continue;
}
double tt1=300*sqrt(2.0)/v1;
double tt2=600.0/v2;
double v12=v1*v1,v22=v2*v2;
double t1=300.0/v1;
double t2=900.0/v2;
if(t1>=t2)
{
puts("No");
continue;
}
if(tt1<=tt2)
{
double dt=(600*v12)*(600*v12)-4*(v12-v22)*(v12*90000-90000*v22);
double x=(-600.0*v12+sqrt(dt))/2.0/(v12-v22);
if((x+600)/v1<=t+(600-x)/v2)
{
puts("Yes");
continue;
}
}
double dt=(1800*v12)*(1800*v12)-4*(v12-v22)*(v12*810000-90000*v22);
double x=(1800.0*v12-sqrt(dt))/2.0/(v12-v22);
if(sqrt((300.0-x)*(300.0-x)+90000.0)/v1+900.0/v1<=t+(300+x)/v2)
puts("Yes");
else
puts("No");
}
}