6 龜兔賽跑預測
作者: Turbo時間限制: 1S章節: 模擬
問題描述 :
話說這個世界上有各種各樣的兔子和烏龜,但是研究發現,所有的兔子和烏龜都有一個共同的特點——喜歡賽跑。於是世界上各個角落都不斷在發生着烏龜和兔子的比賽,小華對此很感興趣,於是決定研究不同兔子和烏龜的賽跑。他發現,兔子雖然跑比烏龜快,但它們有衆所周知的毛病——驕傲且懶惰,於是在與烏龜的比賽中,一旦任一秒結束後兔子發現自己領先t米或以上,它們就會停下來休息s秒。對於不同的兔子,t,s的數值是不同的,但是所有的烏龜卻是一致——它們不到終點決不停止。
然而有些比賽相當漫長,全程觀看會耗費大量時間,而小華髮現只要在每場比賽開始後記錄下兔子和烏龜的數據——兔子的速度v1(表示每秒兔子能跑v1米),烏龜的速度v2,以及兔子對應的t,s值,以及賽道的長度l——就能預測出比賽的結果。但是小華很懶,不想通過手工計算推測出比賽的結果,於是他找到了你請求幫助,請你寫一個程序,對於輸入的一場比賽的數據v1,v2,t,s,l,預測該場比賽的結果。
輸入說明 :輸入只有一行,包含用空格隔開的五個正整數v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且爲v1,v2的公倍數)
輸出說明 :輸出包含兩行,第一行輸出比賽結果——一個大寫字母“T”或“R”或“D”,分別表示烏龜獲勝,兔子獲勝,或者兩者同時到達終點。
第二行輸出一個正整數,表示獲勝者(或者雙方同時)到達終點所耗費的時間(秒數)。比如:
輸入
10 5 5 2 20
輸出
D 4
輸入
10 5 5 1 20
輸出
R 3
輸入範例 : 10 5 5 3 20 輸出範例 : T 4
這個題好複雜……邏輯簡直絕了
我的思路是這樣的:
每一秒兔子跑不跑要看情況,
如果之前沒休息過,那麼要跑
如果之前休息過了,那麼要看兔子休息時間是否已經結束了
如果兔子休息時間結束了,那麼要看兔子是否領先t米
如果兔子領先了t米以上,那麼不跑,繼續休息
如果沒有領先,那麼要跑
如果兔子休息時間沒結束,那麼不跑,繼續休息
而每一秒烏龜是一定要跑的
整理成代碼如下(其實還經歷了很多次WA……):
/*
T6 龜兔賽跑預測
*/
#include<stdio.h>
int main() {
int time = 0;// 用於計時
int turDis = 0, rabDis = 0;// 龜和兔子跑的距離
int lastReTime = 0;// 兔子上一次休息時間
int v1 = 99, v2 = 53, t = 171, s = 10, l = 5247;
scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &l);
time = 0;// 開始計時
while (1) {
turDis += v2;// 龜一直跑
if (time == 0) {// 第一秒兔子肯定會跑
rabDis += v1;
if (turDis == l || rabDis == l) {// 判斷是否已到終點
time++;
break;
}
if (rabDis - turDis >= t) {// 領先,休息
lastReTime = time + 1;
}
time++;
continue;
}
if (lastReTime == 0) {// 沒休息過,說明前面一直不領先,繼續跑
rabDis += v1;// 跑
if (turDis == l || rabDis == l) {// 判斷是否已到終點
time++;
break;
}
if (rabDis - turDis >= t) {// 領先
lastReTime = time + 1;// 休息
}
time++;
continue;
}
if (time - lastReTime >= s) {// 檢查休息時間是否結束
if (rabDis - (turDis - v2) < t) {// 未領先t米
rabDis += v1;// 跑
if (turDis == l || rabDis == l) {// 判斷是否已到終點
time++;
break;
}
}
else {// 領先
lastReTime = time;// 休息
}
}
if (turDis == l || rabDis == l) {// 判斷是否已到終點
time++;
break;
}
time++;
}
if (turDis < rabDis)
printf("R\n");
else if (turDis > rabDis)
printf("T\n");
else
printf("D\n");
printf("%d\n", time);
return 0;
}
害,看了下一些大佬的代碼,果然我寫的太複雜了,其實只需要計算二者的路程,而路程等於速度乘以時間,速度是恆定的,只是二者跑的時間有差別(因爲兔子要休息,休息的時候是不跑的,所以不算時間),所以只需要關注時間就可以了。我想複雜了的原因就是我把兔子跑的時間和休息的時間雜糅了,這樣就要分各種情況處理,太麻煩了。
修改之後的代碼:
/*
T6 龜兔賽跑預測
將跑的過程分成一段一段來處理
每一段只有兩種情況:
第一種:兔子休息了s秒,烏龜在這段時間跑了s秒
第二種:兔子和烏龜都跑了1s
*/
#include<stdio.h>
int main() {
int turDis = 0, rabDis = 0;// 龜和兔子跑的距離
int turTime = 0, rabTime = 0;// 龜和兔子跑的時間
int v1 = 99, v2 = 53, t = 171, s = 10, l = 5247;
scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &l);
while (turDis < l && rabDis < l) {
// 兔子這一秒跑不跑取決於它有沒有領先
if (rabDis - turDis >= t) {// 領先,休息,休息這段時間當成“1s”來處理,簡化問題
turTime += s;// 烏龜在兔子休息的時候也在跑,所以烏龜跑的時間直接加s
turDis = turTime * v2;
rabDis = rabTime * v1;// 兔子休息時間是沒跑的,所以跑的時間不加,那麼跑的路程也是不變的
}
else {
turTime++;
rabTime++;
turDis = turTime * v2;
rabDis = rabTime * v1;
}
}
if (turDis < rabDis)
printf("R\n%d\n", turTime);
else if (turDis > rabDis)
printf("T\n%d\n", l / v2);
else
printf("D\n%d\n", turTime);
return 0;
}
從這個題我學到了:
- 問題中的兩個對象截然不同時,它們的情況應該分開考慮,避免雜糅,比如這個題中烏龜跑的時間和兔子跑的時間不能混在一起