[杂题]HDOJ5515 Game of Flying Circus

嗯。。。这是一道水题。。。

鉴于还没人写这题的题解, 那我就来写一发。

题意:有个边长为300米的正方形

嗯  这样标号

有两个人A和S,开始的时候A、S都在1(左下角)那个位置。

两个人都要按照2、3、4、1的顺序走。

有两个得分的方法:  ①. 比对手先走到点(2或3或4或1) 先走到的得1分,后走到的不得分。

②. A把S打一顿,A得一分。

题目问的是A能不能获得胜利。

A在正方形里面也是可以随便走的。(比如A能直接从1走直线到3, 但是如果他要得分,他必须回到2,按照2341的顺序走 才能得分)

A只能打S一次,打完之后S会昏迷T秒。A不能在  S到2号点  之前打晕他。

题目保证A的速度$v_1$小于等于S的速度$v_2$。

若是A、S同时到达 点 上,那么是A或B先得分,A再打人的。如果两个人都能得分,那A先得分

分析:

A比S慢,所以肯定要今早把S打昏了,才能开始得分。

因为A也要按照2341的顺序走,所以打晕S的位置应尽量靠近2

因为总共有5分(2、3、4、1四个点四分,A打S 一分),所以A要至少获得3分才能获胜,也就是至少得到2个点的分。

总体可以分为  在2、3之间把S打晕  和  在3、4之间把S打晕  两种情况。

(1、4之间打晕明显是不行的。因为S已经通过2、3、4走到1、4之间了, 那么S就已经得到了3分,A已经不可能获胜了)

特别的,考虑一下4号点。

若A选择在4号点打晕S,那么A是从1走过来的,此时A不能得分。(根据题目 先得分 再打人 )那么S就先得到4号点的分数,A之后才打晕S,

故4号点打晕S也是不能获胜的。

在2、3或者3、4打晕S的情况,(如上分析 要尽量靠近2号点,所以)应在恰好相遇的地方打晕S,而不存在 到达某地 等着S过来打晕他的情况。

那就只要解出相遇的位置,

在2、3打晕S的  判断下A能否先到(或者同时)到4号点

在3、4打晕S的  判断下A能否先到(或者同时)到1号点

Ⅰ.

设相遇点为A 2到A的距离为x

$\frac{\sqrt{x^2+300^2}}{v_1}=\frac{(300+x)}{v_2}$   解出$x$

判断A(回2)到3、4的时间是否小于等于S昏迷之后到4的时间即可。

Ⅱ.

$\frac{\sqrt{x^2+300^2}}{v_1}=\frac{900-x}{v_2}$   解出$x$

判断A(回2)到3、4、1的时间是否小于等于S昏迷之后到1的时间即可。

这种情况A回2号点肯定是走的直线,不必经过3号点。

用求根公式的时候注意正负的取舍(因为是单调的,所以不可能两个根都合法)

(分母为$v_1^2-v_2^2$) 注意分母为零,也就是$v_1=v_2$的时候 特判一下。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 typedef pair<int, int> PI;
 5 const int N=1e5;
 6 const double eps=1e-5;
 7 const LL mod=1e9+7;
 8
 9 int main()
10 {
11     int t, ca=1;
12     scanf("%d", &t);
13     while(t--)
14     {
15         double t, v1, v2;
16         scanf("%lf%lf%lf", &t, &v1, &v2);
17         printf("Case #%d: ", ca++);
18         if(v1==v2)
19         {
20             puts("Yes");
21             continue;
22         }
23         double tt1=300*sqrt(2.0)/v1;  // a dao 3
24         double tt2=600.0/v2;          // b dao 3
25         double v12=v1*v1, v22=v2*v2;
26         double t1=300.0/v1;  // a dao 4
27         double t2=900.0/v2;  // b dao 4
28         if(t1>=t2)
29         {
30             puts("No");
31             continue;
32         }
33         if(tt1<=tt2)  // zai 2 3
34         {
35             double dt=(600*v12)*(600*v12)-4*(v12-v22)*(v12*90000-90000*v22);
36             double x=(-600.0*v12+sqrt(dt))/2.0/(v12-v22);
37             if((x+600)/v1<=t+(600-x)/v2)
38             {
39                 puts("Yes");
40                 continue;
41             }
42         }
43         // zai 3 4
44
45             double dt=(1800*v12)*(1800*v12)-4*(v12-v22)*(v12*810000-90000*v22);
46             double x=(1800.0*v12-sqrt(dt))/2.0/(v12-v22);
47             if(sqrt((300.0-x)*(300.0-x)+90000.0)/v1+900.0/v1<=t+(300+x)/v2)
48                 puts("Yes");
49             else
50                 puts("No");
51
52     }
53     return 0;
54 }

HDOJ5515

这题题目比较长,所以大家都没看吧。。。

重现抢了个FB 哈哈

时间: 2024-10-17 18:23:16

[杂题]HDOJ5515 Game of Flying Circus的相关文章

【最小生成树杂题】

这里谈一下最小生成树 生成树的概念:连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树.生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.常用于求最小生成树得算法包括kruskal(克鲁斯卡尔)算法或Prim(

_杂题_

杂题集 是个放题的好地方! **** 5.28 **** - BZOJ [3052] 糖果公园 - 据说是一道区间操作的综合题,但现在貌似蹦了? 现在还是太水,之后再来写吧. *************

HDU 5515 Game of Flying Circus 二分

Game of Flying Circus Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5515 Description The discovery of anti-gravitations technology changed the world. The invention of anti-gravitation shoes (Grav-shoes) enable

[杂题]URAL1822. Hugo II&#39;s War

看懂题意的请直接跳过下一坨! 本人有表达障碍! ========================================== 题意: (题意真的很难很难懂啊!!!  去他娘的**) 有一个王国,王国里有一个国王(编号为1),他有(编号为2~n) n-1个臣子(这些臣子并不全和他有直接关系) 然后呢 国王要去打架,但是只有当他的x%个及以上的直系下属(与他有直接关系的臣子)做好打架的准备了,他才能去打架 他的直系下属也有下属,也要其中x%及以上的下属做好打架准备了,那些直系下属才会开始准备

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

hdu 4961 数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=4961 先贴个O(nsqrtn)求1-n所有数的所有约数的代码: vector<int>divs[MAXN]; void caldivs() { for(int i=1;i<MAXN;i++) for(int j=i;j<MAXN;j+=i) divs[j].push_back(i); } 有了这个当时理下思路就可写了,但是重复数处理注意: 1.用一个数组vis[]  vis[i]=1表示i存在

poj 杂题 - 1959 Darts

这一题放在杂题里,是因为我没有用DP,而是使用的枚举,当然是受到了discuss里面的启发. 因为我们只能有三次机会,每一次只可以是固定的63个数,所以枚举感觉更加直观,但是不知道是不是没有DP快. #include<stdio.h> #include<string.h> int n; int Darts[63]; int main(){ int t,c=1,i,j,k,res; scanf("%d",&t); for(i = 0 ;i<=20;i

poj 杂题 - 2081 Recaman&#39;s Sequence

这道题目一开始就能知道考点在如何缩短查找时间.所以加快查找是我们的重点.但是在大数据面前,查找算法都不够快,所以我们用简单的hash思想来做. 我们开一个数组a,当出现了一个数b时,把该数作为下标调整值,即a[b] = -1,下一次出现该值的时候直接去找这个值作为下标的a值是否为-1即可. #include<stdio.h> #include<string.h> #define MAX 5000010 int p[MAX]={0}; int s[MAX]={0}; int main

杂题选录

LuoguP3948数据结构 10-20 是比较裸的差分题目,但是要注意在线查询的时候开始傻了,每次都暴力地从1到n搞一遍,还存在数组中每次都要清空...结果T了很多点. 其实在线查询的时候直接用变量+扫到r就行了. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 typedef long long ll; 7 8 int n,opt,tot,