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

UVA136 丑数 Ugly Numbers

这道题是经典的“丑数”生成问题。由于需要按顺序找到第 \(1500\) 个丑数,且丑数是由 \(2, 3, 5\) 的乘积构成的,我们可以利用 小根堆(最小优先队列) 来解决。

解题思路

  1. 核心思想
    • 丑数序列是递增的。
    • 如果我们已经有一个丑数 \(x\),那么 \(2x, 3x, 5x\) 也是丑数。
    • 我们可以从最小的丑数 \(1\) 开始,每次取出当前最小的丑数,生成新的丑数并放入池中,直到取到第 \(1500\) 个。
  2. 数据结构
    • 使用 std::priority_queue(配合 greater 实现小根堆)来维护当前的丑数集合,确保每次都能取出最小值。
    • 使用 std::set 或者是判断逻辑来去重。因为同一个数可能被多次生成(例如 \(6\) 可以由 \(2 \times 3\) 生成,也可以由 \(3 \times 2\) 生成)。
  3. 注意事项
    • 数据可能会溢出 32 位整数,计算过程中建议使用 long long
    • 题目没有输入,程序直接运行并输出结果即可。

C++ 代码实现

这是使用优先队列的简洁写法:

#include <iostream>
#include <vector>
#include <queue>
#include <set>using namespace std;int main() {// 定义小根堆,类型为 long long 防止溢出priority_queue<long long, vector<long long>, greater<long long>> pq;// 使用 set 进行去重set<long long> seen;// 初始化:放入第一个丑数 1pq.push(1);seen.insert(1);long long current_ugly = 0;// 循环提取 1500 次最小值for (int i = 0; i < 1500; ++i) {current_ugly = pq.top(); // 取出堆顶(当前最小值)pq.pop();// 将当前丑数分别乘以 2, 3, 5long long next_vals[3] = {current_ugly * 2, current_ugly * 3, current_ugly * 5};for (long long val : next_vals) {// 如果该数未出现过,则入堆并记录if (seen.find(val) == seen.end()) {seen.insert(val);pq.push(val);}}}// 输出格式必须严格匹配题目要求cout << "The 1500'th ugly number is " << current_ugly << "." << endl;return 0;
}

关键点总结

  • 去重:必须处理重复生成的数字(如 \(6, 10, 15\) 等),否则计数会出错。使用 std::set 是最简单的去重方法。
  • 溢出:虽然第 \(1500\) 个丑数(\(859,963,392\))在 int 范围内,但在生成后续候选数(如乘以 \(5\))的过程中可能会短暂超出 int 范围,因此全程使用 long long 更安全。
  • 输出格式:注意题目要求的标点符号,单词 1500'th 中的单引号不能漏掉。

如果你需要极致的运行效率,也可以使用 三指针法(动态规划),时间复杂度为 \(O(N)\),但优先队列法在 \(N=1500\) 时已经足够快且更易于理解。

http://www.jsqmd.com/news/309704/

相关文章:

  • 小型语言模型在商业应用中的优势分析
  • 慢一点,并不会让你更安全
  • 使用RAG和FastAPI构建生产就绪的AI智能体
  • 腾讯企业邮箱中山服务商:千万注意这5个合作陷阱!
  • 智能体还是技能?答案是两者并存
  • 佛山腾讯企业邮箱服务商,这些秘密你必须知道!
  • 从数据到动作:一座疆鸿智能MODBUS TCP转PROFIBUS网关的精准制药使命
  • 计算机毕业设计springboot基于springboot的外卖系统 基于 Spring Boot 的在线外卖服务平台设计与实现 Spring Boot 框架下外卖配送系统的开发与应用
  • 计算机毕业设计springboot防疫物资捐赠 基于Spring Boot的防疫物资管理平台设计与实现 Spring Boot框架下的防疫物资捐赠与管理系统开发
  • 英伟达20亿美元注资CoreWeave扩建算力中心,OpenAI招聘放缓引发AI效率思考,千问PC和网页端上线国内最强推理模型
  • 2026年回收厂家权威推荐榜:火锅店打包回收/烘焙设备回收/监控设备回收/茶楼设备回收/配电箱回收/酒店整体设备回收/选择指南
  • 亲测好用!专科生必备8款AI论文工具测评
  • 向量数据库是什么:原理、必要性与应用全景
  • Java毕设选题推荐:基于springboot + vue敬老院管理系统基于springboot的敬老院管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 基于springboot的教学辅助问答系统 计算机毕业设计选题 计算机毕设项目 前后端分离【源码-文档报告-代码讲解】
  • 向量数据库 vs 向量插件(以 PGVector 为代表):工程边界与选型逻辑
  • VUE3获取子组件实例
  • 主流向量数据库横向对比:选型视角下的全景分析
  • 2026年格力空调供应商厂家最新推荐:软水净水系统/净水系统供应商/分户净水系统/别墅地暖供应商/商务净水系统/选择指南
  • 【通信原理】卫星地面站与卫星车协同工作原理深度解析
  • 【工具变量】城市网络关注度数据(2011-2019)
  • 分页的实现
  • 计算机毕业设计springboot学科竞赛活动报名系统 基于Spring Boot的学科竞赛活动报名与管理系统设计 Spring Boot框架下的学科竞赛活动在线报名平台开发
  • 2026制造业中央空调回收高效服务推荐榜
  • 宏智树AI:终结课程论文“凑字焦虑”,从合格到高分的底层逻辑
  • 2026/1/27
  • 计算机Java毕设实战-基于java+springboot的流浪猫狗救助系统基于springboot的宠物领养救助系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 线段树区间加维护前缀最值
  • 写论文软件哪个好?宏智树 AI 实测封神!从选题到答辩的学术避坑指南
  • pythn中什么是命名空间?什么是作用域?他们之间有什么区别和联系?