找倍數(優先佇列解法)

2021-07-11 09:32:14 字數 796 閱讀 8562

時限:1000ms 記憶體限制:10000k  總時限:3000ms

描述對於每個輸入的數字(如:2),則要求 給出乙個由1,0構成的十進位制整數,且該整數為輸入數字的某個倍數,且是滿足該條件的最小數(如2對應的10)。

輸入數字n,n等於0時停止。

輸出n的乙個滿足條件的最小倍數。

輸入樣例2

0輸出樣例

10提示

**首先,從1開始,把1塞進優先佇列, 每次取優先佇列中最小的元素出來,判斷是否已經可以整除。如果不行如果末尾為0,那麼就有兩種生成狀態,乙個是加一,另乙個是乘以十。如果末尾為一,那麼就只有乘以十。把生成的元素塞進優先佇列。如此反覆。

為什麼普通佇列不行呢?因為普通佇列無法保證當前取出的元素是最小的,而按上面的塞元素的方法不一定是小的元素在前。所以有可能導致明明還有更小的解但是無法等到它出隊時前面乙個更大的元素整除了就輸出了。

另外注意一下優先佇列的相關語法(如取佇列元素是top而不是front),要過載一下運算子,告訴程式怎麼判斷元素優先順序。

#include #include #include using namespace std;

struct cmp

};priority_queue , cmp> q;

int n;

unsigned long long create, now;

void clearqueue()

return;

}int main()

q.push(1);

while (!q.empty())

else

}} cout<

多元Huffman編碼問題(優先佇列解法)

問題描述 在乙個操場的四周擺放著n堆石子,現要將石子有次序地合併成一堆。規定每次至少選2堆至多選k堆石子合併成新的一堆,合併的費用為新的一堆石子數。計算出將n堆石子合併成一堆的最大總費用和最小總費用。演算法設計 對於給定的n堆石子,計算合併成一堆的最大總費用和最小總費用。資料輸入 檔案的第1行有2個...

找最小的k個數(優先佇列)

描述 青大最優雅的程式設計師kkun一直友好 的致力於為學妹們出一道做法優雅而且非常簡單的題。例如著名的 一道非常簡單的爐石題 一道非常簡單的簽到題 一道非常簡單的數學題 一道非常簡單的平衡樹套替罪羊樹套喜羊羊樹套聖誕樹套動態仙人掌 一道非常簡單的簽到題 這個人是真的優雅,比那個菜凡不知道高到 去了...

貪心演算法牛擠奶 優先佇列解法

有n頭牛 1 n 50,000 要 給定每頭牛 的時間區間a,b。牛需要呆在畜欄裡才能 乙個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部 工作,以及每頭牛都放哪個畜欄裡?注意 在同乙個畜欄的兩頭牛,它們 時間區間不能在端點重合。輸入格式 第1行 乙個正整數n 第2 n 1行 第i ...