find a way to escape
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
題解:
分析:
如圖:0068在圓心處,惡魔在大圓點處,0068圈內運行速度v1,惡魔和0068圈外速度均爲v2,圓半徑爲R。可知,只要出圈時爲捉住,就不會再抓住。問題轉變爲:0068上岸時,惡魔能否正好抓到0068.
~常見解法(此解錯誤):
0068沿着黑色線段衝向岸邊(相對惡魔最遠點),惡魔沿着藍色弧線衝向對面。
我們來看看這種做法:既然是這個思路,那麼圈內存在0068角速度大於惡魔角速度的區域,那走直線就會浪費掉這點優勢。
分析後,我們求出最優走法:
在小圈(小圈,0068和惡魔角速度相同時對應r的圓),0068的角速度肯定大於惡魔,所以,無論多長時間,總會造成現在的局面(0068在小圓上最遠離惡魔的地方)。現在0068以v1的速度沿着藍色線段衝向岸邊,惡魔以v2的速度沿着藍色弧線衝向對面,比較現在兩者用時便可解決問題。
附上代碼:
#include<stdio.h>
int main()
{
double v1,v2,R;
double r,t1,t2;
while(scanf("%lf%lf%lf",&R,&v1,&v2)!=EOF){
r=v1*R/v2;//由角速度相等的等式,求出小圓半徑
t1=(R-r)/v1;
t2=3.1415926*R/v2;
if(t1<t2){//分別求得兩者時間進行比較
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}