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

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。

問題描述

在荒漠中舉辦拉力賽,爲避免前車事故停車影響後車成績,賽車分批出發。每隔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)))


結語

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




作者:劉仕豪

實習編輯:衡輝

稿件來源:深度學習與文旅應用實驗室(DLETA)

本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章