給定m個序列,每個包含n個非負整數。
現在我們可以從每個序列中選擇乙個數字以形成具有m個整數的序列。
很明顯,我們一共可以得到n
mn^m
nm個這種序列, 然後我們可以計算每個序列中的數字之和,並得到n
mn^m
nm個值。現在請你求出這些序列和之中最小的n個值。
對於每組測試用例,均以遞增順序輸出最小的n個序列和,數值之間用空格隔開。
0首先我們來看樣例,輸入為
12 3
1 2 3
2 2 3
輸出為3 3 4
根據題意我們可以得出所有的序列和為:1+2 1+2 1+3 2+2 2+2 2+3 3+2 3+2 3+3這九個數,則最小的n個為3 3 4。
如果我們將m(設m=2)個序列先從小到大排序,這樣我們要求的系列和就變成了
a0+b0 a1+b0 … an-1+b0
a0+b1 a1+b1 … an−
1an-1
an−1
+b1…
a0+bn-1 a1+bn-1 … an-1+bn-1
由於我們的系列是有序的,則得到的序列和也是有序的,每組序列和的第乙個一定是該組中最小的,所以我們就從這些小的中選乙個最小的,選完之後去掉,則該組中最小的變成了ai+1 + bj;這樣重複n次,我們就得到了需要的最小的n個序列和。
然後考慮m>2的情況,我們可以先合併前兩個,得到乙個長度為n的序列和,再依次和後面的每乙個進行合併,這樣對於每一次操作都相當於m=2的情況。
#include
#include
#include
#include
#include
#include
#define ll unsigned long long
using
namespace std;
int a[
4010
],b[
4010
],c[
4010
],n,m;
pair<
int,
int> t;
priority_queueint,
int>
, vectorint,
int>
>
, greaterint,
int>
>>q;
intmain()
sort
(a,a+n)
;for
(int j=
1;j)for
(int i=
0;i)scanf
("%d"
,&b[i]);
sort
(b,b+n)
;for
(int i=
0;i) q.
push()
;for
(int i=
0;i;//移動a陣列的下標,t.first中已經在上次加上了a[t.second],所以注意要減去
}memcpy
(a,c,n*4)
;//int佔4個字元
}for
(int i=
0;i)printf
("%d "
,a[i]);
printf
("\n");
}return0;
}
AcWing 146 序列(優先佇列)
這排版我真搞不懂,明明我這邊是ok的 題目大意 給定 m m 個序列m 每個包含 n n 個非負整數。現在我們可以從每個序列中選擇乙個數字以形成具有 m m 個整數的序列。很明顯,我們一共可以得到 n m n m 個這種序列,然後我們可以計算每個序列中的數字之和,並得到 n m n m 個值。現在請...
AcWing 145 超市 146 序列
商品有保質期和價值,要在保質期內把商品賣出才有收入,每天只能賣一件,問產品的的最大利益是多少 這道題目,我們很容易發現是有乙個貪心策略,也就是對於 t 天,我們需要在保證不賣出過期商品的前提下,賣出利潤前t大的商品.所以呢,我們可以把商品按照保質時間排序,然後建立乙個小根堆,對於每乙個數而言,如果說...
bzoj1345 序列問題 貪心
對於乙個給定的序列a1,an,我們對它進行乙個操作reduce i 該操作將數列中的元素ai和ai 1用乙個元素max ai,ai 1 替代,這樣得到乙個比原來序列短的新序列。這一操作的代價是max ai,ai 1 進行n 1次該操作後,可以得到乙個長度為1的序列。我們的任務是計算代價最小的redu...