Uva 136 - Ugly Numbers

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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,greater >Myqueue;
    mapint>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初步)