首页 > 代码库 > HDU 1593 find a way to escape

HDU 1593 find a way to escape

find a way to escape

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1389    Accepted Submission(s): 508



Problem Description
一日,话说0068与***泛舟湖上。忽见岸边出现他的一大敌人elnil。0068当然不想落入elnil的魔爪,于是他就得想办法逃脱。

这个湖是一个很规则的圆形,半径为R。此时0068正好在圆心位置。小船在湖中的速度为 V1,0068和elnil在岸上的速度都为V2。也就是说,如果0068在刚上岸的时候没被抓到,则他可逃脱。在任意时刻,0068和elnil都可以朝任何方向移动,但是0068不能一直呆上船上(会饿死的),elnil不能下水(他不会游泳)。假设0068和elnil都非常聪明,总能做对自己最有利的事情,而且两个人的体力都是无限的。

请问,0068最终能不能逃脱elnil的魔爪?
 

Input
本题目包含多组测试。请处理到文件结束。
每组测试包含三个整数,R,V1,V2。
 

Output
对于每组数据,如果0068能够安全逃脱,输出Yes,否则输出No。
数据不会出现正好抓到的情况,所以你可不用太考虑临界点。
 

Sample Input
100 10 20 100 10 50
 

Sample Output
Yes No
 

Author
linle
 

Source
HDU 2007-Spring Programming Contest - Warm Up (1)
 

Recommend
8600   |   We have carefully selected several similar problems for you:  1598 1599 1594 1798 1492

开始天真的以为只要0086往敌人的对角跑再判断就行了。。然后。。结果。。很显然就WA了。。

正确思想应该是这样的:

 首先,我们知道角速度等于 速度除以半径,即:w = v / r  

又因为,湖的半径不会变,且岸边人总是采取最好的策略,那么他的角速度就一定是 W2 = V2 / R 

而湖中人想要能逃脱的话,他肯定会采取一种策略,就是 你以湖中心转多少角度,我就也转多少角度,

也就是说,你岸边人,只要我的角速度和你的一样,你就肯定和我,还有湖中心,三个点在一条直线上,但是我只要保持这个状态,然后向前划就可以了

因为岸边人相对于湖中心的半径是R,而湖中人最开始的半径是0,所以最开始出发时,只要湖中人,把握的好,他的角速度一定可以一直等于岸边人的,

也就是说,他能让岸边人,像站在原地一样,而他自己却已经离开了湖中心。

但是我们也知道,能保持这样的状态时有个条件的,那就是湖中人的角速度要大于等于岸边人的。

这个条件的边界就是 他们两个的角速度相等。即:

W1 = W2 ==>  V1 / r = V2 / R  ==>  r =V1 * R / V2  

从这里我们可以知道,当处于边界状态时,湖中人已经离开湖中心 r 的距离了。  而岸边人还是和他还有湖中心,三点成一直线,

那么,  假如R< r  那么此时他就一定能逃脱了。因为他上岸了,但是岸边人还过来不了,速度一样快的情况下,他肯定能逃。

 而 假如  R> r   那么就要看 船速和人的速度了。

即:  假如在剩下的  R-r   的距离里,船划过去的时间是  (R-r )/ V1  要小于π * V2 /R 即岸边人冲到他的对岸的距离所用的时间。

那么,湖中人肯定就能逃掉。

假如大于的话,  那肯定就逃不了了。 

我也不知道这题是那类题,所以归数论吧。
代码:0MS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define Pi 3.1415926
double Max(double v1,double v2,double R)
{
  return v1*R/v2;   //计算角速度相同时的同心圆的半径。
}
int main()
{
 double v1,v2,R;
 double r;
 while(scanf("%lf%lf%lf",&R,&v1,&v2)!=EOF)   //不要以为整型真的可以,后面还要转换,所以直接浮点型输入。
 {
     r=Max(v1,v2,R);
     double t1=(R-r)/v1;     
     double t2=Pi*R/v2;
     if(t1<t2) printf("Yes\n");
     else printf("No\n");
 }
 return 0;
}