例题5-7 UVA 136 Ugly Numbers丑数(set+优先队列)

这里综合运用了Set 和 优先队列:

整体思路:

凡是2,3,5的倍数的都是丑数,所以可以开一个优先队列(整数越小,优先级越高),先插入1,在插入用1乘以2,3,5得到2,3,5的倍数,然后把优先队列的.top去掉,不断取top直到1500个为止:

收获:常用优先队列(整数越小,优先级越高):

priority_queue<long long ,vector<long long>,greater<long long >  >pq;

#include<queue>
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
int main()
{
    const int cofee[] = {2,3,5};
    priority_queue<ll,vector<ll>,greater<ll> >pq;//整数越小,优先级越高!
    set<ll>s;
    s.insert(1);
    pq.push(1);
    for (int i = 1; i < 1500; ++i){
        ll x = pq.top();
        pq.pop();
        for (int j = 0; j < 3; ++j){
            ll num = cofee[j] * x;
            if (!s.count(num)){//之所以得检测一下num是否存在,是因为pq优先队列是不能保证元素不重复的,但又不好查找,所以直接用set查找!
                s.insert(num);
                pq.push(num);
            }
        }
    }
    printf("The 1500'th ugly number is %lld.\n",pq.top());

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值