UVA136 Ugly Numbers【set】【优先队列】

                                                   丑数

 

 题目大意:

丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来,结果如下: 1,2,3,4,5,6,8,9,10,12,15,… 求第1500个丑数。

 

提示:从小到大生成各个丑数。最小的丑数是1,对于任意丑数x,2x,3x和5x也是丑数。使用一个优先队列保存已生成的丑数,每次取出最小的丑数,生成3个新的丑数。需要注意,同一个丑数有多种生成方式,所以需要判断一个丑数是否已经生成过。

 

题目链接:https://vjudge.net/contest/211547#problem/G

#include<iostream>
#include <functional>             //包含greater
#include<vector>
#include<queue>
#include<set>
using namespace std;
typedef long long LL;
const int coeff[3] = { 2, 3, 5 };

int main() {
    priority_queue<LL, vector<LL>, greater<LL> > pq;
    set<LL> s;
    pq.push(1);
    s.insert(1);
    for (int i = 1; ; i++) {
        LL x = pq.top(); pq.pop();
        if (i == 1500) {
            cout << "The 1500'th ugly number is " << x << ".\n";
            break;
        }
        for (int j = 0; j < 3; j++) {
            LL x2 = x * coeff[j];
            if (!s.count(x2)) { s.insert(x2); pq.push(x2); }
        }
    }
    return 0;
}

 

2018-03-25  18:41:35

posted @ 2018-03-25 18:42  悠悠呦~  阅读(222)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end