7.6.9 Game of Flying Circus

题目描述

反重力技术的发现改变了世界。反重力鞋(Grav鞋)的发明使人们能够在空中自由飞翔。这导致了一项新的空中运动的兴起:“飞行马戏(Flying Circus)”。 参赛者穿着反重力鞋和飞行服进行比赛。比赛是在一个特定的场地内,并要求参赛者在特定的时间内争取得分。比赛场地是一个边长为 300 米的正方形,在正方形的四个角都漂浮着浮标,而这四个浮标按顺时针顺序编号为 1, 2, 3, 4。

图 1

两名选手从 浮标#1 开始比赛。比赛开始后,他们就按顺时针顺序触碰四个浮标。(因为 浮标#1 是起点,所以他们要触碰的第一个浮标是 浮标#2,此后,他们要按序触碰 浮标#3,#4,和#1)。这里要注意,他们可以在比赛场地内自由飞行,甚至可以在正方形场地的中央飞行。

在以下两种情况下,选手可以得一分。

  1. 如果你比你的对手先触碰一个浮标,你将得一分。例如,在比赛开始后,如果你的对手比你先触碰了 浮标#2,那么他得一分;而到你触碰到 浮标#2 的时候,你就不会得分。同时注意,在 触碰浮标#2 之前,你不能触碰 浮标#3 或任何其他浮标。
  2. 不考虑浮标得分,而是靠格斗得分。如果你和你的对手在相同位置遭遇,你可以和你的对手进行一场格斗来得一分。考虑到游戏的平衡性,在 浮标#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

输入

 
  1. 2
  2. 1 10 13
  3. 100 10 13

输出

 
  1. Case #1: No
  2. 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");

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值