1. 程式人生 > >Uva136 Ugly Numbers(優先佇列priority_queue的使用 大白例題5-7)

Uva136 Ugly Numbers(優先佇列priority_queue的使用 大白例題5-7)

題意:醜數是指不能被2,3,5以外的其他素數整除的數,求第1500個醜數

解題思路:從小到大生成各個醜數,對於任意醜數x,2x,3x,5x也是醜數,這樣就可以用一個優先佇列儲存suo'y所有已生成的醜數,每次取出最小的醜數生成3個新的醜數。唯一需要注意的是當前的生成的醜數有沒有生成過。

AC程式碼:

#include<stdio.h>
#include<iostream>
#include<vector>
#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;
	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 tx=x*coeff[j];
			if(s.count(tx)==0)
			{
				pq.push(tx);
				s.insert(tx);
			}
		}
	}
	return 0;
}