2014-09-26 2 views
-1

링크 : http://www.spoj.com/problems/PRO/SPOJ 726 코드 : PRO 잘못된 답변? 질문에 대한

내가

을 수행 한 문제는 목록에서 최소 및 최대 요소를 선택하고 총에 추가하도록 요청 무엇, 그것은 해결하기 위해 파이썬에서 heapq 모듈을 사용 질문은 제공된 테스트 케이스를 통과했지만 제출 후 잘못된 대답을 제공합니다.

내 질문

내 코드에 문제가 있습니까?

내 코드 왜 그냥 목록보다는 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

힙 조건은 힙 [0]이 최소임을 보장합니다. 최대 값이 힙 (heap) [-1]이라는 보장은 없습니다. 테스트 케이스가 통과 한 것은 아마도 사고 일 것입니다. 나는 당신이'4 10 5 5 1'을 올바른 방향으로 무작위로 추출했다면, 끝이 아니라 10 점이 될 것이라고 생각합니다. –

답변

0

? 고려하십시오 :

inp.sort() 

while len(inp) >= 2: 

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

문제는 이보다 복잡합니다. 최대 5000 일마다 더 많은 숫자가 추가됩니다. 파이썬의 정렬은 기존 순서를 이용하므로 정렬 된 목록 (매일)과 기존의 정렬 된 목록을 O (n)에 가깝게 확장 할 수 있습니다. –

+0

매일 밤마다 k가 가장 작은 숫자와 k 개의 가장 큰 숫자 만 유지하면됩니다. 여기서 k는 프로모션에 남은 일수입니다. 그 중간에있는 것은 결코 사용되지 않을 것입니다. –