AcWing146 序列 貪心

2021-09-25 22:35:56 字數 1702 閱讀 4633

給定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...