UVA136有关优先队列

其实优先队列是个伪命题,因为优先队列完全可以由集合set来代替,因为集合中的元素一定是从小到大依次排列的,取出最小或者最大的元素后,再使用erase(),将取出的元素删掉。

优先队列比集合多出的一个功能是可以找到第一个进入优先队列的元素,但这也是个伪命题,因为第一个进队列的也可能是优先级最大的,然后再某一次取数中就被取出去了。

最后再来说说丑数这道题。

从集合(pq)中取出最小的数,依次乘以2,3,5,放入另一个集合(set)中,然后再冲pq中取出最小的数,再乘一次放入set中。同时这些乘出来的新的丑数必须也放到(pq)当中去,以便下次取出最小数。

这个地方就有个很有趣的东西了,如果使用优先队列,那么往优先队列中放新的丑数的时候,必须判断之前有没有放过这个数,否则就会放到里面两个。

然后使用集合构成的优先队列时,不需要这么干,因为集合中的元素唯一。

下面贴出使用集合构成的优先队列的解决丑数问题的代码:

#include<cstdio>
#include<queue>
#include<vector>
#include<iostream>
#include<set>
using namespace std;
typedef long long LL;
//priority_queue<LL,vector<LL>,greater<LL>> pq;
set<LL>Set;
set<LL>pq;
int main()
{
    Set.insert(1);
    pq.insert(1);
    for(int i=1;;i++)
    {
        LL x=*pq.begin();
        pq.erase(x);
        if(i==1500)
        {
            cout<<x<<endl;
            return 0;
        }
        LL y=2*x;
        Set.insert(y);
        pq.insert(y);
        y=3*x;
        Set.insert(y);
        pq.insert(y);        
        y=5*x;
        Set.insert(y);
        pq.insert(y);
    }
}

最近特别的焦虑,特别的焦虑,痛恨之前的自己。

猜你喜欢

转载自www.cnblogs.com/TorettoRui/p/10420060.html