UVA 136 & POJ1338 Ugly Numbers

题目大意:

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. 
把只含有2.3.5因数的数称为丑数,默认第一个丑数是1。 
POJ是有多次询问,输出第n个丑数 
UVA是询问第1500个丑数是多少。

思路:

利用STL的优先队列,创建一个小数优先的优先队列,然后每次取队头,分别乘以2.3.5,利用map看是否被放入过队列。从而得到按照大小顺序排列的丑数。

代码:

UVA

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main()
 5 {
 6     ll num=1;
 7     priority_queue<ll,vector<ll>,greater<ll> > q;//小数优先的优先队列
 8     map<ll,ll> mp;
 9     int x[3]={2,3,5},cnt=1;
10     q.push(num);
11     mp[num]++;
12     while(!q.empty())
13     {
14         num=q.top();
15         q.pop();
16         if(cnt==1500){
17             cout<<"The 1500‘th ugly number is "<<num<<"."<<endl;
18             break;
19         }
20         for(int i=0;i<3;++i){
21             ll a=num*x[i];
22             if(mp[a]==0){//对取过的丑数进行标记
23                 q.push(a);
24                 mp[a]++;
25             }
26         }
27         cnt++;
28     }
29     return 0;
30 }

POJ

 1  #include<iostream>
 2 #include<cstdlib>
 3 #include<queue>
 4 #include<map>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long ll;
 8 int main()
 9 {
10     ios::sync_with_stdio(false);
11     ll num=1;
12     ll ugly[1510];//打表存数,对于询问直接输出
13     priority_queue<ll,vector<ll>,greater<ll> > q;
14     map<ll,ll> mp;
15     int x[3]={2,3,5},cnt=1;
16     q.push(num);
17     mp[num]++;
18     while(!q.empty())
19     {
20         num=q.top();
21         q.pop();
22         ugly[cnt]=num;
23         if(cnt==1500)
24             break;
25         for(int i=0;i<3;++i){
26             ll a=num*x[i];
27             if(mp[a]==0){
28                 q.push(a);
29                 mp[a]++;
30             }
31         }
32         cnt++;
33     }
34     int n;
35     while(cin>>n&&n)
36         cout<<ugly[n]<<endl;
37     return 0;
38 }

时间: 2024-10-26 15:02:32

UVA 136 & POJ1338 Ugly Numbers的相关文章

poj1338 Ugly Numbers(丑数模拟)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1338 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 number

POJ1338 Ugly Numbers(解法二)

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,结果放在数组ans[]中,也是生产丑数的x:素数放在数组prime[]中,这个问题只有2.3和5:生成的丑数放在数组ugly[]中,然后选出最小的放入结果数组ans[]中,对于被放

POJ1338 Ugly Numbers

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C++语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,使用一个STL的容器set来存放丑数.集合具有去重复,自动排序的功能,对于解决本问题是方便的.但是,set对象无法用下标访问,所以倒腾到vector对象中再使用.本问题打表是合

UVA 136 Ugly Numbers

原题代号:UVA 136 原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=72 题目原题: Ugly Numbers Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5,

丑数(Ugly Numbers,UVA 136)

#include<iostream> #include<set> #include<vector> #include<queue> using namespace std; const int coeff[3]={2,3,5}; typedef long long LL; int main() { priority_queue<LL,vector<LL>,greater<LL> > pq; set<LL> s;

UVa 136 Ugly Numbers(优先队列)

题意  质因数只可能有2,3,5的数称为丑数  输出第1500个丑数 STL优队列应用  1是丑数 丑数的2,3,5倍都是丑数  用优先队列模拟就行了 #include <cstdio> #include <cstring> #include <set> #include <queue> using namespace std; typedef long long ll; //priority_queue<ll, vector<ll>, g

UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

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, 15, ... shows the first 11 ugly numbers. By convention, 1 is included. Write a program to find and print the 1500'th ugly number. Input Ther

Ugly Numbers(POJ1338)(丑数,技巧性强)

Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20851   Accepted: 9248 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 num

【优先队列基础练习】POJ1338 Uva136 - Ugly Numbers题解

昨天夜里学了栈.队列和优先队列,栈还有的地方不大懂,队列基本可以,优先队列很高兴.本想今天上午继续弄这个,但是跟着李晨他们一块听了清华交院罗雨屏老师讲的计算几何= =虽然以我的水平听计算几何有点早,但至少是听懂了很多,感觉很高兴:十点多就没有再听,毕竟之后越来越深亚历山大.于是就来写一下丑数的题解. 题目:除2,3,5外不能被其他素数整除的数为丑数,求第1500个丑数(Uva版),求第n(n<=1500)个丑数(POJ版) 思路:第一个是1,放入升序优先队列(小的先出),之后每次出队第一个元素,