做法:
將 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 ...