我想找到最好的共同時間來改變其他時間最少(差異的總和是最低的)。
在輸入時,我有時間陣列。
在輸出時,應該有新的、共同的時間。
請注意,時間不能排序并且絕對不同(例如 02:00、02:30 和 03:30)
示例 1
輸入:["01:00", "02:00", "03:00", "04:00", "05:00"]
輸出應該是03:00
,因為最好將 01:00 更改為 03:00(更改 2 小時),02:00 更改為 03:00(更改 1 小時),保持 03:00 不變,04:00 更改為 03 :00(1 小時)和 05:00 至 03:00(2 小時)。
示例 2
輸入:["12:00", "13:00", "14:00"]
輸出應為13:00
- 將 12:00 更改為 13:00(1 小時)和 14:00 更改為 13:00(1 小時)
示例 3(棘手)
輸入:["23:00", "01:00", "02:00"]
輸出應該是01:00
- 將 23:00 更改為 01:00(2 小時)和 02:00 更改為 01:00(1 小時)(棘手的是 23:00 - 最佳時間不是13:00)
我嘗試了平均時間的函式,例如https://stackoverflow.com/a/52839039/19022995,但不幸的是它不起作用
我將非常感謝提示如何做到這一點
先感謝您
uj5u.com熱心網友回復:
引理:最佳答案與給定時間之一一致。
為了證明這一點,請考慮一個與任何給定時間都不相符的解決方案。嘗試將其向前移動一點,然后向后移動一點。在至少一種情況下,總差異沒有增加。所以,繼續朝那個方向移動,直到你達到給定的時間之一。
現在剩下的是撰寫一個計算差異的函式,將 23:59 到 00:00 的環繞考慮在內。
之后,嘗試每個給定的時間作為候選答案,計算每個時間的總差異,然后選擇最好的一個作為最終答案。
在偽代碼中:
time (h, m) = h * 60 m
diff (t1, t2) = min (abs (t1 - t2), 60 * 24 - abs (t1 - t2))
t[0..n) = given times
total (x) = sum {diff (x, t[i])} for i in [0..n)
answer = arg min {total (t[i])} for i in [0..n)
uj5u.com熱心網友回復:
一種方法是尋找包含所有時間的最小“視窗”。為此,請(天真地)對時間進行排序,并將每次都視為“第一次”。例如,在您的第三個示例中,將 1:00 視為第一次將導致 22 小時視窗(因為這使得“最后”時間為 23:00);將 2:00 視為第一次將導致 23 小時視窗;但將 23:00 視為第一次將導致 3 小時的視窗。從那里,簡單地計算相對于第一次,計算差異 mod 24。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470822.html