給出m個包含n個整數的陣列 a1,a2 ··· am。分別在a1 ,a2,⋯,am中任意出乙個數並且相加,可以得到 nm 個和。求這些和中最小的n個。
輸入第一行兩個整數 m,n(1 <= m,n <= 1000)。接下來 m行,每行每行n個整數,表示陣列 a。1<=aij
<=109
從小到大輸出最小的n個和,用空格隔開。
2 41 3 5 7
2 4 6 8
3 5 5 7一看到前n個最小值我們就可以想到優先佇列的方式,難點是如何去求nm個數並進行比較。如果直接暴力的話,肯定是會tle的,所以要用另外一種方式。
對於m行,我們可以先進行縮小範圍,如果乙個和在m行中是最小的,那麼它肯定是在第一行與第二行的最小和的基礎上去加其他的和。
所以我們可以兩兩組合順序求n個最小和,現在的問題轉換為了如何求兩行之間的n個最小值,如果直接暴力的話,時間複雜度為f((m-1)*n2)~o(n3)會tle。
仔細分析題目我們可以發現,它並沒有規定每乙個數字只能使用一次,所以對於兩行資料,它前n個最小數的情況只有兩種:1.第一行最小的數字加上第二行的任意數字。2.第二行的最小的數字加上第一行的任意數字。這樣我們就可以優化我們的時間複雜度了。
#include
#include
#include
#include
#include
using
namespace std;
typedef
struct node
}node;
//其中a是用來儲存第一行的下標,b是用來儲存第二行的下標。
long
long a[
1005][
1005
],t[
1005];
intmain()
}for
(int i=
0;i) node temp;
for(
int i=
1;i)for
(int j=
0;jfor(
int j=
0;jfor(
int j=
0;j1;j++
)cout << t[j]
<<
" ";
cout << t[n-1]
<< endl;
return0;
}
數列求和 加強版 PAT
原題如下 給定某數字a a 1 le a le 91 a 9 以及非負整數n n 0 le n le 1000000 n 10 0000 求數列之和s a aa aaa cdots aa cdots as a aa aaa a a a n n個aa 例如a 1a 1,n 3n 3時,s 1 11 1...
7 38 數列求和 加強版
給定某數字a 1 a 9 以及非負整數n 0 n 100000 求數列之和s a aa aaa aa a n個a 例如a 1,n 3時,s 1 11 111 123。輸入數字a與非負整數n。輸出其n項數列之和s的值。1 3123最近這些天一直在玩,沒怎麼寫 看到這題直覺就是像以前一樣開闢字元陣列,昨...
7 38 數列求和 加強版
給定某數字a 1 a 9 以及非負整數n 0 n 100000 求數列之和s a aa aaa aa a n個a 例如a 1,n 3時,s 1 11 111 123。輸入數字a與非負整數n。輸出其n項數列之和s的值。如果這道題按數學中的四則運算去直接計算結果,該資料會超出long long 的範圍,...