您的位置:首页 > 其它

例题5-7 UVA 136 Ugly Numbers丑数(set+优先队列)

2015-12-22 23:35 399 查看
这里综合运用了Set 和 优先队列:

整体思路:

凡是2,3,5的倍数的都是丑数,所以可以开一个优先队列(整数越小,优先级越高),先插入1,在插入用1乘以2,3,5得到2,3,5的倍数,然后把优先队列的.top去掉,不断取top直到1500个为止:

收获:常用优先队列(整数越小,优先级越高):

priority_queue<long long ,vector<long long>,greater<long long > >pq;

#include<queue>
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
int main()
{
const int cofee[] = {2,3,5};
priority_queue<ll,vector<ll>,greater<ll> >pq;//整数越小,优先级越高!
set<ll>s;
s.insert(1);
pq.push(1);
for (int i = 1; i < 1500; ++i){
ll x = pq.top();
pq.pop();
for (int j = 0; j < 3; ++j){
ll num = cofee[j] * x;
if (!s.count(num)){//之所以得检测一下num是否存在,是因为pq优先队列是不能保证元素不重复的,但又不好查找,所以直接用set查找!
s.insert(num);
pq.push(num);
}
}
}
printf("The 1500'th ugly number is %lld.\n",pq.top());

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: