1333:【例2-2】Blah数集 一本通 队列
1333:【例2-2】Blah数集时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1)a是集合Ba的基,且a是Ba的第一个元素; (2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中; (3)没有其他元素在集合Ba中了。 现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少? 【输入】输入包括很多行,每行输入包括两个数字,集合的基a(1≤a≤50))以及所求元素序号n(1≤n≤1000000)。 【输出】对于每个输入,输出集合Ba的第n个元素值。 【输入样例】1 100 28 5437 【输出样例】418 900585 提交 统计信息 提交记录 |
教学备忘录:编辑 |
无 |
给学生提示:编辑 |
无 |
题意:最开始集合中有一个数,每次需要把这个数的2倍加1和3倍加1放入这个集合,然后需要把新放入的这两个数他们的2倍加1和3倍加1也放进这个集合中,保证每个数的2倍加1和3倍加1都在这个集合中,那么可以知道我们这个集合是无限大的,让我们找到集合中,从小到大排在第n位的数。
解释样例:1 8 以1为基 找到第8个数
第1步. 集合中:1
待放入:3,4 把最小的放进去,下面以此类推
第2步.集合中:1,3
待放入:4,7,10
第3步.集合中:1,3,4
待放入:7,10,9,13(此时3*3+1大于后求的4*2+1,所以并不能依次把集合中的数的倍数加1放入集合中,要按升序放,需进行处理)
第4步.集合中:1,3,4,7
待放入:10,9,13,15,22
第5步.集合中:1,3,4,7,9
待放入:10,13,15,22,19,28
第6步.集合中:1,3,4,7,9,10
待放入:13,15,22,19,28,21,31
第7步.集合中:1,3,4,7,9,10,13
待放入:13,15,22,19,28,21,31,27,40
第8步.集合中:1,3,4,7,9,10,13,15
待放入:13,15,22,19,28,21,31,27,40,31,46 (此时待放入的数中有两个31,一个是10*3+1,另一个是15*2+1,需要处理两数相等的情况)
此时集合中最后一个数就是我们所求的第8位
方法1:找三个队列,一个储存集合数,一个储存集合中数的2倍加1的数,一个储存集合中数的3倍加1的数;
将集合队头的2倍加1和3倍加1分别放入其他两个队列,集合出队;
比较其他两个队列队头元素大小,每次把小的放进集合,出队;
遇到相同的就放入集合一次,并且2,3同时出队。
样例: 1 8
第1步:集合:1
2倍加1队列:3
3倍加1队列:4
第2步:集合:1,3
2倍加1队列:7
3倍加1队列:4,10
第3步:集合:1,3,4
2倍加1队列:7,9
3倍加1队列:10,13
第4步:集合:1,3,4,7
2倍加1队列:9,15
3倍加1队列:10,13,22
第5步:集合:1,3,4,7,9
2倍加1队列:15,19
3倍加1队列:10,13,22,28
第6步:集合:1,3,4,7,9,10
2倍加1队列:15,19,21
3倍加1队列:13,22,28,31
第7步:集合:1,3,4,7,9,10,13
2倍加1队列:15,19,21,27
3倍加1队列:22,28,31,40
第8步:集合:1,3,4,7,9,10,13,15
2倍加1队列:15,19,21,27,31
3倍加1队列:22,28,31,40,46
此时后两个队列中都有31,在入队时要进行判断,判断2,3队列队头元素是否相等,想等的话入队一个。
#include <iostream>
#include <queue>
using namespace std;int n, a, cnt2, cnt3, num2, num3, x;int main()
{while (cin >> a >> n) {queue<int> q2, q3, q; q.push(a);int i;for (i = 1; i < n; i++) {q2.push(q.front()*2+1);q3.push(q.front()*3+1);if (q2.front() < q3.front())q.push(q2.front()), q2.pop();else if (q2.front() > q3.front())q.push(q3.front()), q3.pop();else q.push(q3.front()), q2.pop(), q3.pop();q.pop();}cout << q.front() << endl;}return 0;
}
方法2:只用一个队列或数组储存集合,再用两个标记变量记录该哪个数的2倍加1或3倍加1放入集合了;其实跟上面用3个队列的原理相同。
样例: 1 8
第1步:集合q:1
该放哪个数的2倍加1,即下标:1 ,q[1]*2+1 = 3(假设从1位置开始存)
该放哪个数的3倍加1,即下标:1 ,q[1]*3+1 = 4
第2步:集合:1,3
该放哪个数的2倍加1,即下标:2 ,q[2]*2+1 = 7
该放哪个数的3倍加1,即下标:1 ,q[1]*3+1 = 4
第3步:集合:1,3,4
该放哪个数的2倍加1,即下标:2 ,q[2]*2+1 = 7
该放哪个数的3倍加1,即下标:2 ,q[2]*3+1 = 10
第4步:集合:1,3,4,7
该放哪个数的2倍加1,即下标:3 ,q[3]*2+1 = 9
该放哪个数的3倍加1,即下标:2 ,q[2]*3+1 = 10
第5步:集合:1,3,4,7,9
该放哪个数的2倍加1,即下标:4 ,q[4]*2+1 = 15
该放哪个数的3倍加1,即下标:2 ,q[2]*3+1 = 10
第6步:集合:1,3,4,7,9,10
该放哪个数的2倍加1,即下标:4 ,q[4]*2+1 = 15
该放哪个数的3倍加1,即下标:3 ,q[3]*3+1 = 13
第7步:集合:1,3,4,7,9,10,13
该放哪个数的2倍加1,即下标:4 ,q[4]*2+1 = 15
该放哪个数的3倍加1,即下标:4 ,q[4]*3+1 = 22
第8步:集合:1,3,4,7,9,10,13,15
该放哪个数的2倍加1,即下标:5 ,q[5]*2+1 = 19
该放哪个数的3倍加1,即下标:4 ,q[4]*3+1 = 22
仍需记得处理第一种方法两数都为31的情况
#include <iostream>
using namespace std;int a, n, q[10000005], tail, cnt2, cnt3, num2, num3;int main()
{while (cin >> a >> n) {q[1] = a;tail = 2, cnt2 = 1, cnt3 = 1;while (tail <= n) {num2 = q[cnt2]*2+1;num3 = q[cnt3]*3+1;if (num2 < num3) q[tail++] = q[cnt2++]*2+1;else if (num2 > num3) q[tail++] = q[cnt3++]*3+1;else q[tail++] = q[cnt2++]*2+1, cnt3++;}cout << q[n] << endl;}
}
1333:【例2-2】Blah数集 一本通 队列相关推荐
- 【信奥赛一本通】1333:【例2-2】Blah数集(详细代码)
[图论算法]1333:[例2-2]Blah数集 1.[题目描述] 2.[代码] 1.[题目描述] [题目描述] 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下 ...
- 1333:【例2-2】Blah数集
1333:[例2-2]Blah数集 注意是数组,答案数组中不能有重复数字 q数组是存储答案的 代码: #include<iostream> #include<cstdio> # ...
- 【1333】【例2-2】Blah数集
[1333][例2-2]Blah数集 时间限制: 1000 ms 内存限制: 65536 KB 题解大全: 点这里 [题目描述] 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基 ...
- 信息学奥赛一本通 1333:【例2-2】Blah数集 | OpenJudge NOI 3.4 2729:Blah数集
[题目考点] 1. 队列 [解题思路] 要填入Blah数集的一共有两类数 第一类:由2x+1生成的数 第二类:由3x+1生成的数 那么开两个队列q2与q3,分别存储由2x+1和3x+1生成的数字.这两 ...
- Openjudge2729 Blah数集(单调队列)
2729:Blah数集 总时间限制: 3000ms 内存限制: 65536kB 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合B ...
- C++3.4数据结构之队列基础+blah数集题解
C++3.4数据结构之队列基础+blah数集题解 队列(queue)是一种限定在一端进行插入,另一端删除的特殊线性表 . 就像排队买东西一样, 队列的出队就像排在前面的人买完东西后离开(删除). 队列 ...
- 队列做题:1333:Blah数集(单调队列);1334:围圈报数
1333:Blah数集(单调队列) 又是一种奇怪的数据结构(算法),见得太少了. 注意:不是优先队列(堆)哟!!!. 注意:集合中的元素不可以重复!!!. 讲解: https://blog.csdn. ...
- NOI 3.4 队列 2729:Blah数集(单调队列)
题目来源:http://noi.openjudge.cn/ch0304/2729/ 2729:Blah数集 总时间限制: 3000ms 内存限制: 65536kB 描述 大数学家高斯小时候偶然 ...
- 2729:Blah数集
2729:Blah数集 总时间限制: 3000ms 内存限制: 65536kB 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的 ...
最新文章
- (转)用ASP.NET向Javascript传递变量 方法1:
- vsc系统是什么意思_crm系统什么意思
- 【HDU - 5056】Boring count (尺取法)
- UVA - 10534
- atitit.编辑表单的实现最佳实践dwr jq easyui
- java学习是网上java学习视频好,还是报班比较好
- 最新JAVA调用新浪微博API之发微博、发图片
- 常州2021高考成绩查询,2021年常州高考成绩排名及成绩公布时间什么时候出来
- SQL学习笔记(02)_别名
- Linux Cpuidle介绍
- 二本机械毕业2年,从外包ETL到大厂数据开发,月薪13K到年薪40W
- 微信点餐系统要服务器吗,微信点餐系统,钉钉点餐系统
- 天龙固件U盘更新_2020年的无线音响好用不?用HEOS体验天龙HOME250
- 机器视觉检测助力软包动力电池检测
- 快速学习Maven-从私服下载 jar 包Nexus
- 期刊论文需要查重吗?
- 在自己项目或者 vue 中使用可爱的二次元((Live2D)
- 施工部署主要不包括_施工管理目标是单位工程施工部署的重要内容,其目标不包括()。A.质量目标B.社会行为目标C.工期目标...
- (65)-- 爬取58交友信息
- 冯·诺依曼结构计算机的存储器和数据
热门文章
- 美国人这样教育小学生(转载)
- 《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图
- paypal 的支付流程
- oracle erp的库存管理软件,教你如何充分利用ERP库存管理系统
- 数字孪生石油化工产业实施方案
- SQL Server 2014安装教程(保姆级图解教程)
- 计算机主板复位电路的组成,电脑主板复位电路工作分析1..doc
- 匿名类有名字还叫匿名类吗?
- 移动硬盘出现“位置不可用无法访问,磁盘结构损坏且无法读取”的解决方法
- 湖北省水系数据,水库数据,线要素和面要素