2014-09-26 77 views
-1

鏈接問題:http://www.spoj.com/problems/PRO/SPOJ 726代碼:PRO錯誤的答案?

我做了什麼

問題要求你從列表中選擇的最小和最大元素,並把它添加到總,它使用heapq模塊在Python解決這個問題雖然通過了提供的測試用例,但在提交之後給出了錯誤的答案。

我的問題

什麼是我的代碼錯?

我的代碼

import sys 
from heapq import * 

n = int(sys.stdin.readline()) 
inp = [] 
total = 0 

for _ in range(n): 

    text = [int(x) for x in sys.stdin.readline().split()] 

    k = text[0] 

    del text[0] 

    inp.extend(text) 

    heapify(inp) 

    while(len(inp)>=2): 

     Max = inp.pop(-1) 

     Min = heappop(inp) 

     total += (Max-Min) 

print(total) 
+0

堆狀況只保證堆[0]是最小值。不能保證最大值是堆[-1]。測試用例通過可能是一個意外。我懷疑,如果你以正確的方式隨機化了「4 10 5 5 1」,那麼最終可能不會有10個。 – 2014-09-28 22:36:50

回答

0

你爲什麼不只是使用一個列表,而不是一個heapq?考慮:

inp.sort() 

while len(inp) >= 2: 

    Max = inp.pop(-1) 
    Min = inp.pop(0) 
    total += (Max-Min) 
+0

這個問題比這更復雜 - 在5000天內每增加一個數字。我會注意到,Python的排序利用了現有的順序,因此通過排序列表(每天)來擴展現有的排序列表並且使得排序靠近O(n)。 – 2014-09-28 22:40:51

+0

還值得注意的是,每天之後,只需要保留k個最小和k個最大數字,其中k是促銷中剩餘的天數。之間的任何事情都不會被使用。 – 2014-09-28 22:43:18