题目描述
反重力技术的发现改变了世界。反重力鞋(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
思考他们会在哪里相遇
A要赢只能在2 3 或者 3 4之间的某一个位置相遇 然后 在相应的情况下赢三分 就可以获胜否则失败
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int t;scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
double T,v1,v2;
cin>>T>>v1>>v2;
if(v1==v2)//第一段相遇 速度相等的情况 等到走到2的时候就把他打晕 必赢
{
printf("Case #%d: Yes\n",cas);
continue;
}
if(300.0 * sqrt(2) / v1 < 600.0 / v2)// 第二段相遇
{
double l = 0,r = 300;
for(int i=0;i<100;i++) // 二分一百次逼近正确答案
{
double mid = (l+r)/2.0;
double len = mid * mid + 300 * 300;
len = sqrt(len);
double t1 = len / v1;
double t2 = 300 / v2 + mid / v2;
if(t1 > t2)r = mid;
else l = mid;
}
double t1,t2;
t1 = sqrt(l*l+300*300)/v1+(300 - l)/v1+300/v1;
t2 = T + 3*300 / v2;
if(t1<=t2)printf("Case #%d: Yes\n",cas);
else printf("Case #%d: No\n",cas);
}
else if(300.0 / v1 < 900.0 / v2)
{
double l = 0,r = 300;
for(int i=0;i<100;i++)
{
double mid = (l+r)/2.0;
double len = (300-mid) * (300-mid) + 300 * 300;
len = sqrt(len);
double t1 = len / v1;
double t2 = (600 + mid) / v2;
if(t1 > t2)l = mid;
else r = mid;
}
double t1,t2;
t1 = sqrt(300*300+l*l)/v1+(300-l)/v1+300/v1;
t2 = T + 300*4/v2;
if(t1<=t2)printf("Case #%d: Yes\n",cas);
else printf("Case #%d: No\n",cas);
}
else printf("Case #%d: No\n",cas);
}
return 0;
}