P1631 序列合併

2021-08-04 22:54:22 字數 864 閱讀 5683

做法:

將 a 和 b 都從小到大排一遍序。

然後組成這樣乙個矩陣:

a1+b1 , a1+b2 , a1+b3 , …… , a1+bn

a2+b1 , a2+b2 , a2+b3 , ……,a2+bn

a3+b1……

…… ……

an+b1 , an+b2 , an+b3 , ……,an+bn

正確性:我們先把每行的頭扔進堆裡,每行的頭是每行中的最小值,所以這樣我們能在堆裡取到乙個最小值。當我們取出第x行的元素時,我們就把它後面那個元素扔進堆裡,因為任意時刻每行的頭是這一行中最小的,所以這樣我們總是能夠在堆裡找到當前未輸出過的最小的值,正確性就能夠保證了。

做法是不是很機智呢,但是不是我自己想的啊

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,a[100009],b[100009];

struct h

int num=0;

while(numprintf("%d ",l.x);

h p;

p.k1=l.k1;p.k2=l.k2+1;

p.x=a[p.k1]+b[p.k2];

q.push(p);

num++;

}return

0;}

P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿足1 n 1000 對於...

P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到 n 2n2 個和,求這 n 2n2 個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數 a iai 滿足 a i le a ai ai 1 且 a i le 10 9ai 10 9 第三行n個整數 b ibi 滿足 b i ...

P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數ai 滿足ai ai 1 且ai 10 9 第三行n個整數bi 滿足bi bi 1 且bi 10 9.資料規模 對於50 的資料中,滿足1 n 1000 ...