我正在尝试解决UVa在线评判中的编程问题:
这个问题的问题设定者在heap
上编写了一个教程,并对其进行了一些操作,包括插入,删除节点,并在该文章末尾提到 - 这个问题可以通过使用堆来解决。可能还有其他方法可以解决它但我无法弄清楚如何使用heap
解决此问题。我知道如何使用C ++编写堆,并可以定义insert()
,remove()
,print()
函数以及其他一些操作,例如查找最小项目等。
这个问题与堆有什么关系?
答案 0 :(得分:1)
想到的方法:
有一个(最初是空的)对象堆,其中包含一个单词及其位置 - 按位置对此堆进行排序。
smallestDistance = infinity
biggestSize = 0
for each word in the input:
heap.insert(Pair(current position, word))
hashMap[word] = current position
// We saw the word after this occurrence, so remove it
while hashMap[heap.minimum.word] != heap.minimum.position
heap.pop()
// We found another word!
// The previous smallest is invalid, since it doesn't contain this word
if heap.size > biggestSize
smallestDistance = currentPosition - heap.minimum
biggestSize = heap.size
// Is this distance better than the best so far? If so, use it instead
else
smallestDistance = min(smallestDistance, currentPosition - heap.minimum)
output smallestDistance