題目描述
給定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...