POJ1338 Ugly Numbers

题目大意:规定质因子只有2,3,5的数是Ugly Numbers。对于给定的n,输出第n个Ugly Numbers。(n<=1500)

分析:

        可以先求出前1500个Ugly Numbers,然后直接输出即可。因此可以得到所有的Ugly Numbers都是2^a*3^b*5^c,其中a,b,c>=0.直接枚举a,b,c没有规律,所以可以使用队列的数据结构。首先将1压入队列,然后循环:取队列首元素e,检查e是否出现过,出现过就继续,没有出现过就将e储存到一个数组里,将e*2,e*3,e*5压入队列。这样之后可以高效地选出所有的Ugly Numbers。可以再度加入一个优化,使用优先队列,那么可以保证数字是严格从小到大出现的。


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
long n,v,w;
long long u[2000];
struct cmp
{bool operator() (long long a,long long b)
 {return a>b;}};
priority_queue<long long,vector<long long>,cmp> q;

bool find(long long k)
{for(long i=1;i<=v;i++) if(u[i]==k) return true;
 return false;}

int main()
{freopen("in.in","r",stdin);
 q.push(1);
 long long a;
 w=1;
 while(v<=1500){a=q.top();
                q.pop();
		     	if(!find(a)){u[++v]=a;
		     	             
			                 q.push(a*2);
			                 q.push(a*3);
			                 q.push(a*5);}}
 
 while(~scanf("%d",&n) && n) cout<<u[n]<<endl;
 return 0;}



本来判重是用set实现的,但是效率太低,反而不如暴力的一位数组。



posted on 2015-10-24 11:57  lcyzgdy  阅读(126)  评论(0编辑  收藏  举报

导航