Game of Flying Circus

文章讨论了一场基于反重力鞋的空中比赛——飞行马戏,参赛者需按顺序触碰浮标得分。文章详细介绍了不同类型的选手(Speeder,Fighter,All-Rounder)以及他们的策略。在Asuka(All-Rounder)与Shion(Speeder)的训练赛中,Asuka需要找到能通过一次格斗获胜的机会。通过对速度和路径的计算,文章分析了Asuka赢得比赛的可能性。
摘要由CSDN通过智能技术生成
题目描述

反重力技术的发现改变了世界。反重力鞋(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

 

   思考他们会在哪里相遇  

   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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值