算法 丑数(Ugly Numbers,UVa 136)及优先队列练习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43269048/article/details/99846053

贴上题目链接UVa136
分析:丑数即指不能被2,3,5以外的其他素数整除的数,把丑数从小到大排列,求第1500个丑数。题目有很多方法,暴力法不用考虑,铁定超时,我们采用从小到大逐个生成丑数的方式。最小的丑数是1,(我其实有点疑惑,1可以被2,3,5整除吗?可是问题列举出来的第一个就是1。。)而对于任意丑数x来说,2x、3x、5*x也都是丑数。这样,就可以用一个优先队列保存所有已经生成的丑数,每次取出最小的丑数,生成三个新的丑数,但是需要判断这个丑数是否已经生成过。代码如下:

#include <iostream>
#include <cstdio>
#include <set>
#include <sstream>
#include <string>
#include <typeinfo>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype> 
#include <queue>
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;
	pq.push(1);
	s.insert(1);
	for(int i=1;;i++)
	{
		LL x=pq.top();pq.pop();
		if(i==1500){
			cout<<"The 1500'th ugly number is "<<x<<".\n";
			break;
		}
		for(int j=0;j<3;j++)
		{
			LL x2=x*coeff[j];
			if(!s.count(x2)){
				s.insert(x2);
				pq.push(x2);
			}
		} 
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_43269048/article/details/99846053