### 计划
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;
}