oj1026 醜數(優先佇列以及尋找最優解)

2021-10-23 01:22:12 字數 1425 閱讀 3177

題目要求

醜數就是這個數的質因子只有2,3,5,7這四個,除此之外不再含有其它

別的質因子。

注意1也被認為是醜數.醜數的前20個為

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, … ;

input

每行輸入乙個n,1 <= n <= 5842,n為0時輸入結束.

output

輸出相應的第n個醜數.

sample input

raw123

4111213

2122

23100

1000

5842

0sample output

raw123

4121415

2830

32450

385875

2000000000

這道題在以前,只會常規遍歷尋找數字是否整除等於0時,總是顯示超時。最近看到了vector,set,map以及優先佇列又想起來了。

第一遍做的時候很單純,醜數是2,3,5,7的倍數,只要從最小的醜數1開始,用乙個優先佇列保持所有已生成的醜數,每次取出最小的那個數字讓它乘上2,3,5,7自然可以得到下乙個醜數,因為是優先佇列,可以使它從小到大直接排列,要注意的使這樣做會出現重複數字,所以要記得去重。最後只要知道所給數字,即可知道該位置上的醜數了。

完整**

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int num[4]

=;intmain()

for(

int j=

0;j<

4;j++)}

}while

(cin>>t)

return0;

}

後來問學長關於佇列的相關知識,他說我這做複雜了。。。

可以利用尋找最優解的思想,第乙個確定ans[1]=1,現在有2,3,5,7四種方式指向ans[1],這裡肯定會選擇2。以此類推可以確定第二個,第三個。。。。

這裡貼部分**

inline

void

init()

}

醜數 優先佇列 詳細解答

題目 醜數是一些因子只有2,3,5的數。數列1,2,3,4,5,6,8,9,10,12,15 寫出了從小到大的前11個醜數,1屬於醜數。現在請你編寫程式,找出第1500個醜數是什麼。輸出 the 1500 th ugly number is 為你找到的第1500個醜數 注意 是你找到的數,輸出中沒有...

1026優先佇列

include include using namespace std int n,m,a 2 4 struct node struct labyrinth maze 100 100 int bfs else maze n 1 m 1 c x q.push now while q.empty maz...

Uva136 醜數 優先佇列

找出第1500個素因子只能有2或3或5的數。懵逼了吧,並不是素因子篩,用2,3,5去篩並不能得到滿足醜數要求的數,例如14就篩不掉。優先佇列每次取乙個最小的數x,2x,3x,5x,都是醜數,但是每次要判斷是否有重數 set 取1500,每次都是取出最小的數,取1500次之後就是第1500個數。inc...