STL初步———优先队列

丑数

1.使用工具

privority_queue:优先队列,定义在queue头文件中,内部元素具有优先顺序,也可以更改排序方式。
set:采用其中的count方法,可以确定元素是否存在,和python中的in操作符具有同样的功能。
greater:定义在functional头文件中,用于改变默认的优先级

2.源代码

//2020年4月5日16:36:51
//学习优先队列的定义和使用,以及改变优先级的方式,并进一步学习集合的功能
#include <iostream>
#include <vector>
#include <functional> //greater和less的头文件
#include <queue>
#include <set>
using namespace std;

typedef long long LL;
const int coeff[3] = { 2, 3, 5 };//比较倍数

int main()
{
	priority_queue<LL, vector<LL>, greater<LL> >pq;//保存生成的丑数,并逆序存储
	set<LL> s;//同步保存生成的丑数,但其count功能可以用来检查一个丑数是否被生成过
	pq.push(1);//初始化
	s.insert(1);//初始化
	for (int  i = 1; ; i++)
	{
		LL x = pq.top();
		pq.pop();//每当需要一个数来继续生成丑数,就让改数出队

		if (i == 1500){//循环第1500次,刚好是第1500个丑数出队
			cout << "第1500个丑数是:" << x << endl;
			break;
		}

		for (int i = 0; i < 3; i++){
			LL x2 = x*coeff[i];//循环生成丑数
			if (!s.count(x2)){//判断丑数是否被生成
				s.insert(x2);
				pq.push(x2);
			}
		}
	}//!for
	return 0;
}

3.思路所需解决的问题

1.该用什么容器来保存生产的丑数,并方便对下一个数进行处理,来根据顺序正确生成丑数(priority_queue)
2.如何生成丑数
3.如何判断丑数在生成的过程中,之前是否已经被生成过,从而避免重复操作

4.程序分析与问题解决

1.优先队列的使用:本质上是一个可变长的有序数组,且只对第一个元素进行删除处理,采用其他容器也可以做到。但队列的使用防止了程序无法分配1500个空间导致内存容量不够的问题(采用普通数组所引发的)。
2.集合s的使用:用来判断元素是否存在,也就是在生成丑数的过程中,如何判断该数已经被生成过。
3.数组coeff:内部元素为各个倍数,采用循环来实现生成丑数,比较方便。
4.内部的for循环:该for循环为程序的核心功能。对从优先队列中取出的元素进行生成丑数,先利用count来判断丑数是否生成,再将未被生成的丑数传递给set和priority_queue。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值