【问题标题】:SPOJ 726 code: PRO Wrong Answer?SPOJ 726 代码:PRO 错误答案?
【发布时间】:2014-11-21 20:12:53
【问题描述】:

问题链接:http://www.spoj.com/problems/PRO/

我做了什么

问题要求您从列表中选择最小和最大元素并将其添加到总数中,它使用python中的heapq模块来解决问题,虽然它通过了提供的测试用例,但提交后给出了错误答案.

我的问题

我的代码有什么问题?

我的代码

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]是最小值。不能保证最大值是堆[-1]。测试用例通过可能是一个意外。我怀疑如果您以正确的方式随机分配4 10 5 5 1,最后可能没有 10 个。

标签: python python-2.7 python-3.x heap


【解决方案1】:

为什么不只使用列表而不是 heapq?考虑:

inp.sort()

while len(inp) >= 2:

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

【讨论】:

  • 问题比这更复杂——最多 5000 天的每一天都会添加更多的数字。我会注意到 Python 的排序利用了现有顺序,因此通过排序列表(每天)扩展现有排序列表并使用接近 O(n)。
  • 另外值得注意的是,每一天之后,只需要保留k个最小和k个最大的数字,其中k是促销剩余的天数。介于两者之间的任何东西都不会被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多