2014-09-26 78 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