uva11491 奖品的价值(挑数擦除求剩余最大)

贪心,分析,单调队列。
一共n位,要擦d位,等价于从n位里挑n-d位,如何挑最大。由于数的大小比较是从最高位开始的,我们先挑最高位,这样也使得贪心更容易分析。
最高位一定是从前d+1位诞生的,这样后面还剩下n-d-1位,如果前d+1位不产生最高位,那就不足以挑出n-d个数。方便起见,称目前这前d+1位为当前最高位的考虑范围。我们要挑考虑范围中最大的那个,如果有并列的,挑最左边的那个。
挑出来最高位后,问题化解为从这个最高位后面再挑n-d-1个数。接下来我们挑这个子问题的最高位,这时考虑的范围就是剩下的数列排除掉末尾n-d-2个数,换句话说,新的考虑的范围和之前的相比截去了之前挑出的最高位之前的部分,并且向后移动了一个位置。
可以用一个队列来维护“考虑范围”,每次挑选出一个最高位后,将队首的若干元素删掉,并在队尾加入一个新元素。
注意到,如果考虑范围中存在两个元素x、y,x在y的前面但是比y要低,那么x是“无用元素”,因为挑最大时肯定先挑到y,挑到y后x又会从考虑范围内删除,所以如果排除完所有这样的无用元素,考虑范围中的元素应该是单调递减的,即我们应该维护一个单调队列。
每次增加一个新元素时,从队尾依次删除比它小的元素,直到遇到一个不比它小的元素,然后再把新元素加到队尾。
如此队列总是单调递减的,即考虑范围总是单调递减的,所以每次挑最高位时直接取队首元素即可。

你可能感兴趣的:(uva11491 奖品的价值(挑数擦除求剩余最大))