POJ 2442 Sequence 堆的應用

2021-07-22 08:56:02 字數 1099 閱讀 4319

poj 2442

給出m行n列,每行選乙個數組成乙個和,有nm

個結果,問前n小的和是哪些.

【超記憶體】一開始想的思路是以乙個和作為元素用優先佇列,感覺思路還是比較巧妙,有點類似於dijkstra。先把每一行排序,每行的第乙個元素組成的和一定是最小的,通過改變最小的和中某個數(將它右移一位)可以得到n個新的數,將這些數加入優先佇列,每次選擇優先佇列裡最小的和來進行上述的操作。這樣的乙個問題是會爆記憶體,因為每取出乙個和,又會加入n個進去,所以會需要n*n的空間。

限制優先佇列的個數還是應該還是可以過的。

【改後思路】看部落格後發現和別人的思路不一樣,沒有用結構體,大體思路是這樣的:把前k行每行乙個數組成的前n小的和儲存下來,在向前k+1遞推.

這裡用到了stl中的堆

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=999999999;

int t;

int m,n;

int a[105][2005];

int sum[2005];

bool cmp(int a,int b)

make_heap(&temp[1],&temp[n+1],cmp);

sort(sum+1,sum+1+n);

for(int j=2;j<=n;j++)

else

break;}}

for(int j=1;j<=n;j++)sum[j]=temp[j];

}}int main()

sort(a[i]+1,a[i]+n+1);

}work();

sort(sum+1,sum+n+1);

for(int i=1;icout

<" ";

cout

12 3

3 2 1

2 2 3

*/

POJ 2442 Sequence 優先佇列)

題目鏈結 想了想 真沒思路。然後搜一下題解,這個題解講的很好。此問題是k路歸併的加強版,k路歸併好像聽說過。對stl裡的優先佇列,不熟啊。直接看的別人的 學習結構體的優先佇列,還有開乙個標記陣列去記錄。這樣還錯了好幾次。分析還是去看那個題解把。1 include 2 include 3 includ...

poj 2442 Sequence(優先佇列)

題目 題意 給你n m的矩陣,然後每行取乙個元素,組成乙個包含n個元素的序列,一共有n m種序列,讓你求出序列和最小的前n個序列的序列和。又是乙個機智的題 1 include 2 include3 include4 include5 include6 include7 include8 includ...

POJ 2442 Sequence堆 優先佇列

題目描述 給定m個序列,每個序列包含n個非負整數。現在我們可以從每個序列中選擇乙個數字以形成乙個具有m個整數的序列。顯然,我們可以得到n m種這種序列。然後,我們可以計算每個序列中的數字總和,並獲得n m個值。我們需要的是最小的n個和。你可以幫我們嗎?題目大意 給定m個長度為n的序列,從每個序列中任...