19116 丑数

### 计划

1. **输入处理**:读取输入的正整数 `T` 和 `T` 行的正整数 `n`。
2. **生成丑数**:使用最小堆(优先队列)生成丑数,确保每次取出的数都是当前最小的丑数。
3. **存储丑数**:将生成的丑数存储在一个数组中,以便快速查找第 `n` 个丑数。
4. **输出结果**:根据输入的 `n`,输出对应的第 `n` 个丑数。

### 伪代码

1. 读取输入 `T` 和 `T` 行的正整数 `n`。
2. 初始化最小堆 `minHeap`,并将初始丑数 `1` 插入堆中。
3. 使用数组 `seen` 记录已经生成的丑数,避免重复。
4. 初始化数组 `uglyNumbers` 用于存储生成的丑数。
5. 循环生成丑数,直到生成足够多的丑数(至少到达最大 `n`)。
6. 每次从堆中取出最小的丑数,并将其乘以 `2`, `3`, `5` 后的结果插入堆中(如果结果不在 `seen` 中)。
7. 将生成的丑数存储在 `uglyNumbers` 数组中。
8. 根据输入的 `n`,输出对应的第 `n` 个丑数。

### C++代码


#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;

vector<long long> generateUglyNumbers(int maxN) {
    vector<long long> uglyNumbers;
    priority_queue<long long, vector<long long>, greater<long long>> minHeap;
    set<long long> seen;

    minHeap.push(1);
    seen.insert(1);

    while (uglyNumbers.size() < maxN) {
        long long current = minHeap.top();
        minHeap.pop();
        uglyNumbers.push_back(current);

        if (seen.find(current * 2) == seen.end()) {
            minHeap.push(current * 2);
            seen.insert(current * 2);
        }
        if (seen.find(current * 3) == seen.end()) {
            minHeap.push(current * 3);
            seen.insert(current * 3);
        }
        if (seen.find(current * 5) == seen.end()) {
            minHeap.push(current * 5);
            seen.insert(current * 5);
        }
    }

    return uglyNumbers;
}

int main() {
    int T;
    cin >> T;
    vector<int> queries(T);
    int maxN = 0;

    for (int i = 0; i < T; ++i) {
        cin >> queries[i];
        if (queries[i] > maxN) {
            maxN = queries[i];
        }
    }

    vector<long long> uglyNumbers = generateUglyNumbers(maxN);

    for (int i = 0; i < T; ++i) {
        cout << uglyNumbers[queries[i] - 1] << endl;
    }

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值