東華oj-挑戰題第6題-龜兔賽跑預測

在這裏插入圖片描述

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

從這個題我學到了:

  1. 問題中的兩個對象截然不同時,它們的情況應該分開考慮,避免雜糅,比如這個題中烏龜跑的時間和兔子跑的時間不能混在一起
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章