UVa 11860:如何使用堆来解决它

时间:2013-10-24 13:35:35

标签: algorithm heap

我正在尝试解决UVa在线评判中的编程问题:

Uva 11860 Document Analyzer

这个问题的问题设定者在heap上编写了一个教程,并对其进行了一些操作,包括插入,删除节点,并在该文章末尾提到 - 这个问题可以通过使用堆来解决。可能还有其他方法可以解决它但我无法弄清楚如何使用heap解决此问题。我知道如何使用C ++编写堆,并可以定义insert()remove()print()函数以及其他一些操作,例如查找最小项目等。

这个问题与堆有什么关系?

1 个答案:

答案 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