n個最小和加強版

2021-10-03 05:31:16 字數 1265 閱讀 9025

給出m個包含n個整數的陣列 a1,a2 ··· am。分別在a1 ,a2,⋯,am中任意出乙個數並且相加,可以得到 nm 個和。求這些和中最小的n個。

輸入第一行兩個整數 m,n(1 <= m,n <= 1000)。接下來 m行,每行每行n個整數,表示陣列 a。1<=aij

<=109

從小到大輸出最小的n個和,用空格隔開。

2 4

1 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 的範圍,...