POJ 2442 Sequence堆 優先佇列

2021-10-08 08:12:47 字數 1494 閱讀 6416

題目描述

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

題目大意:給定m個長度為n的序列,從每個序列中任意取乙個數求和,可以構成n的m次方個和,求其中最小的n個和。

輸入格式

第一行是整數t,它顯示測試用例的數量,然後是t個測試用例。每種情況的第一行都包含兩個整數m,n(0 輸出格式

對於每個測試用例,按公升序列印具有最小n個和的行,並用空格隔開。

樣例樣例輸入

12 3

1 2 3

2 2 3

樣例輸出

3 3 4

資料範圍與提示

poj月刊,廣林

題目分析

1.因為要求是列印前n小的,所以,我們可以給每乙個序列先排個序

這樣我們就可以累加每乙個序列的首位,這個就是第一小的數,然後

我們就要找到第二小的

2.如果我們假設m=2;,則第二小的數在(a[2]+b[1)(a[1]+b[2])中,如果選擇(a[2]+b[1])那麼,第三小的在(a[3]+b[1]),(a[2]+b[2])(a[1]+b[2])中,。。。。

如果選擇(a[k]+b[l],那麼後面一小的在a[k+1]+b[l],a[k][l+1],與前面的剩餘部分

最後求出以個長度n的序列,a,b便和並了,以同樣的道理,和並一共m-1次

3.所以,我們可以建立乙個小根堆,放入每乙個要選擇的和,每一次去取樹根

4因為有重複的可能所以要用以個bool陣列用巧妙的方法限制

#includeusing namespace std;

int heap_size;

int n,m,t;

int a[2005],b[2005],c[2005];

struct ssheap[2005],st,aa;

void put_heap(ss x)

}void get_heap()

if(heap[fa].zs>heap[son].zs)

else

fa=son; }

}int main()

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

for(int i=1;isort(b+1,b+1+n);

st.st1=1;

st.st2=1;

st.pd=0;

st.zs=a[1]+b[1];

put_heap(st);

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

else

}for(int j=1;j<=n;j++) a[j]=c[j];

} for(int i=1;i<=n;i++) printf("%d ",a[i]);

printf("\n");

}}

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 堆的應用

poj 2442 給出m行n列,每行選乙個數組成乙個和,有nm 個結果,問前n小的和是哪些.超記憶體 一開始想的思路是以乙個和作為元素用優先佇列,感覺思路還是比較巧妙,有點類似於dijkstra。先把每一行排序,每行的第乙個元素組成的和一定是最小的,通過改變最小的和中某個數 將它右移一位 可以得到n...