python|拉力賽求最短時間問題解法

  • 2019 年 12 月 24 日
  • 筆記

問題描述

在荒漠中舉辦拉力賽,為避免前車事故停車影響後車成績,賽車分批出發。每隔5分鐘出發10輛車,每輛賽車在通過起點和終點時都會獨立計時。默認所有賽車完賽的正常耗時都在8小時以內。比賽從早上8點開始,下午4點全部結束,這時還沒到終點的車輛不記到達成績。現在得到了所有賽車的單獨計時起止時間,請輸出耗時最少的車輛編號(從1開始,順序編號)和所用耗時。 輸入說明:第一行是一個整數N,表示參加賽事的賽車數量。之後是N行,每行表示一輛賽車的單獨計時時間,時間給出方式為小時+分鐘的形式,如0830 1210表示8點30分通過起點,12點10分通過終點。 輸出說明:耗時最少車輛的序號及所有耗時(用分鐘表示),中間用空格分開,(如果所有賽車都沒有完賽,輸出-1) 輸入樣例: 6 0800 1210 0805 1320 0810 1215 0815 1300 0820 1310 0905 1430 輸出樣例: 3 245

解決方案

先從輸入輸出格式進行觀察,如何才能滿足第一行是一個整數N,表示參加賽事的賽車數量,之後是N行,每行表示一輛賽車的單獨計時時間。我們可以使用一個while循環,當輸入的行數沒到N時,我們就任然需要向下輸入,知道下面的行數到N為止。

再根據題目要求,求出兩個時間之間的間隔,已知0800表示8:00,1210表示12:10,我們分別可以提取0800和1210前兩位和後兩位來計算總分鐘數,例如上面一組數中,相隔時間為(12-8)*60+10=250分鐘。這樣分別求出每組間隔時間。我們把每組間隔時間加入一個列表,求出最短時間,並在另一個列表相對應的位置插入序號,本題就解決了。

python代碼

N = int(input()) n = 0 lis = [] while N > n: n += 1 m = list(map(str,input().split()))#字符串方便分裂 lis.append(m)#上面代碼控制輸入格式 xu = 0 li = [] lu = [] for i in lis: xu+=1 xiaoshi = int(i[1][0:2])-int(i[0][0:2]) fenzhong = int(i[1][2:])-int(i[0][2:]) zong = xiaoshi*60+fenzhong#通過分裂來求時間 lu.append(xu) li.append(zong) if min(li) > 480: print(-1) else: print('{} {}'.format(lu[li.index(min(li))],min(li)))

結語

當我們解決這類編程題時,我們要先從輸入輸出格式方向進行思考,注意區分行和列,遇到多個數據我們基本上是可以通過創建列表來找關係解決。

END

實習編輯 | 張禎悅

責 編 | 劉仕豪