(STL,set,priority_queue)丑数
生活随笔
收集整理的這篇文章主要介紹了
(STL,set,priority_queue)丑数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:
丑數(shù)是指不能被2,3,5以外的其他素?cái)?shù)整除的數(shù)。把丑數(shù)從小到大排列起來(lái),結(jié)果如下:1,2,3,4,5,6,8,9,10,12,…求第1500個(gè)丑數(shù)
分析與解答:
0.對(duì)于任意丑數(shù)x:2x,3x,5x也是丑數(shù)
1.用優(yōu)先隊(duì)列從小到大保存已生成的丑數(shù)(2x,3x,5x)//優(yōu)先隊(duì)列中最多存三個(gè)數(shù)
2.利用set存所有的每次生成的丑數(shù),如果以前出現(xiàn)過(guò)則跳過(guò),不存到優(yōu)先隊(duì)列和set里
3.每次找x從優(yōu)先隊(duì)列隊(duì)首找,保證x是最小的,找出來(lái)后就刪掉x,優(yōu)先隊(duì)列存(2x,3x,5x)
4.找到第1500個(gè)的時(shí)候,由于set的去重判斷,和優(yōu)先隊(duì)列的從小到大的順序,現(xiàn)在出列的一定是第1500個(gè)丑數(shù)
5.優(yōu)先隊(duì)列的優(yōu)先級(jí):
先出隊(duì)列的元素不是先進(jìn)隊(duì)列的元素,而是隊(duì)列中優(yōu)先級(jí)最高的元素
priority_queue< int> pq
pq.top()是最大的數(shù)
priority_queue< int,vector < int >,greater < int > > pq
pq.top()是最小的數(shù)
priority_queue< int,vector < int >,cmp > pq
struct cmp{bool operator()(const int a,const int b) const{return a%10>b%10;} }自定義優(yōu)先級(jí):個(gè)位數(shù)大的整數(shù)優(yōu)先級(jí)反而小
pq.top():個(gè)位數(shù)小的
因?yàn)轭愃朴趕ort,cmp排序’>’,大各位數(shù)放到后面,小的在前面優(yōu)先級(jí)高
6.代碼:
#include<iostream> #include<vector> #include<queue> #include<set> #include<functional> using namespace std;typedef long long LL; const int coeff[3] = { 2, 3, 5 }; int main() {priority_queue<LL, vector<LL>, greater<LL> >pq;set<LL> s;pq.push(1);s.insert(1);for (int i = 1;; i++){LL x = pq.top();pq.pop();if (i == 1500){cout << "The 1500th ugly number is" << x << endl;break;}for (int j = 0; j < 3; j++){LL x2 = x*coeff[j];if (!s.count(x2)){s.insert(x2);pq.push(x2);}}}return 0; }總結(jié)
以上是生活随笔為你收集整理的(STL,set,priority_queue)丑数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (扩展欧几里得)青蛙的约会
- 下一篇: (回溯 UVa129)困难的串