欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVA 136 - Ugly Numbers(优先队列 + 集合)

程序员文章站 2022-07-15 10:45:44
...

UVA 136 - Ugly Numbers(优先队列 + 集合)

题目大意:

所谓丑数,就是除了2 3 5 ,都不能被其他素数整除,输出第1500个丑数。

解题思路:

派生的思想,x是丑数,那么2x 3x 5x都是丑数,每次取最小的数,然后通过这个数派生,然后存入集合,直到取到第1500小的时候输出队首元素即可。AC代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
    priority_queue<ll, vector<ll >, greater<ll > > q;
    set<ll > s;
    ll a[5] = {2, 3, 5};
    int k = 0;
    q.push(1);
    s.insert(1);
    while (++k)
    {
        ll n = q.top();//每次取队首元素,利用队首元素派生
        q.pop();
        if (k == 1500)
        {
            printf("The 1500'th ugly number is %lld.\n", n);
            break;
        }
        for (int i = 0; i < 3; i ++)
        {
            ll t = n * a[i];
            if (!s.count(t))//如果这个数是第一次出现则入队
            {
                s.insert(t);
                q.push(t);
            }
        }
    }
    return 0;
}