日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(STL,set,priority_queue)丑数

發(fā)布時(shí)間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。