当前位置: 首页 > news >正文

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;
}


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构与算法 - B树
  • Django基础知识
  • SpringBoot基础(一):快速入门
  • 【对抗性训练】FGM、AWP
  • 使用 mongoexport 导出 JSON 文件和 使用 mongoimport 导入 JSON 文件
  • Bug 解决 | 前端项目无法正确安装依赖?
  • 免费【2024】springboot 个人健康管理网站的设计与实现
  • 排序算法之基数排序
  • 几个常用脚本
  • 消费企业经营管理的两大痛点!一篇文章讲透解决办法!
  • Spring Boot 3.x Web MVC实战:实现流缓存的request
  • 速盾:高防ip和cdn哪个好?
  • 按钮(Buttons)-Qt-思维导图-学习笔记
  • Flink开发(一):概述与基础
  • SpringCloud 微服务nacos和eureka
  • 【刷算法】从上往下打印二叉树
  • 345-反转字符串中的元音字母
  • C# 免费离线人脸识别 2.0 Demo
  • Druid 在有赞的实践
  • EOS是什么
  • Leetcode 27 Remove Element
  • PhantomJS 安装
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React Transition Group -- Transition 组件
  • ReactNative开发常用的三方模块
  • Redis 懒删除(lazy free)简史
  • Redux 中间件分析
  • 基于webpack 的 vue 多页架构
  • 基于遗传算法的优化问题求解
  • 记一次删除Git记录中的大文件的过程
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何在 Tornado 中实现 Middleware
  • 一个项目push到多个远程Git仓库
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • !$boo在php中什么意思,php前戏
  • # 达梦数据库知识点
  • #Linux(权限管理)
  • #QT(TCP网络编程-服务端)
  • (12)Hive调优——count distinct去重优化
  • (AngularJS)Angular 控制器之间通信初探
  • (LeetCode 49)Anagrams
  • (每日一问)基础知识:堆与栈的区别
  • (一)VirtualBox安装增强功能
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转载)OpenStack Hacker养成指南
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8.0 发布到 IIS
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net MySql
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net插件开发开源框架
  • .NET大文件上传知识整理
  • .NET实现之(自动更新)