POJ - 1338 Ugly Numbers-STL的灵活运用

来源:互联网 发布:电动牙刷 推荐 知乎 编辑:程序博客网 时间:2024/05/22 12:07
POJ - 1338
Ugly Numbers
Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u

Submit Status

Description

Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... 
shows the first 10 ugly numbers. By convention, 1 is included. 
Given the integer n,write a program to find and print the n'th ugly number. 

Input

Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.

Output

For each line, output the n’th ugly number .:Don’t deal with the line with n=0.

Sample Input

1290

Sample Output

1210
map拥有自动排序的强大功能
/*Author: 2486Memory: 680 KBTime: 16 MSLanguage: G++Result: Accepted*/#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <map>#include <iterator>using namespace std;typedef long long LL;const int maxn=1500+5;int S[]= {2,3,5};LL dp[maxn];priority_queue<LL,vector<LL>, greater<LL> >G;map<LL,int>P;int n;void pri() {    G.push(1);    P[1]=1;    int cnt=0;    while(true) {        LL a=G.top();        G.pop();        cnt++;        if(cnt>1500+4)break;        for(int i=0; i<3; i++) {            LL b=a*S[i];            if(!P[b]) {                P[b]=1;                G.push(b);            }        }    }    map<LL,int>::iterator it;    cnt=1;    for(it=P.begin(); it!=P.end(); it++) {        dp[cnt++]=it->first;        if(cnt>1500)return;    }}int main() {    pri();    while(~scanf("%d",&n),n) {        printf("%I64d\n",dp[n]);    }    return 0;}


0 0