您的位置:首页 > 其它

Uva 136 - Ugly Numbers

2016-07-07 14:46 423 查看
题目解析:

根据题目意思,对于每一个丑数x,2x、3x和5x也都是丑数,而最小的丑数是1,因此我们可以从1开始依次的构造出后面所有的丑数,等构造到第1500个时停止,然后输出即可。可以利用优先队列priority_queue< LL,vector,greater >,每次将队首元素x出队列,令2x、3x和5x入队列,应该注意的是每一个进过队列的值都应该做个标记,避免以不同的方式构造出的同一个数多次进入队列。

贴代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
#define MAXV 50010
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int main()
{
priority_queue< LL,vector<LL>,greater<LL> >Myqueue;
map<LL,int>Mymap;
int cnt=1;
LL x=0;
Myqueue.push(1);
Mymap[1]=1;
while(1){
x=Myqueue.top();
if(Mymap.count(x*2)==0){
Myqueue.push(x*2);
Mymap[x*2]=1;
}
if(Mymap.count(x*3)==0){
Myqueue.push(x*3);
Mymap[x*3]=1;
}
if(Mymap.count(x*5)==0){
Myqueue.push(x*5);
Mymap[x*5]=1;
}
if(cnt==1500){
cout << "The 1500'th ugly number is " << x << ".\n";
break;
}
Myqueue.pop();
cnt++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STL初步