P1631 序列合併

2021-08-21 07:04:29 字數 1109 閱讀 3922

有兩個長度都是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\le b_bi

​≤bi

+1​ 且 b_i\le 10^9bi

​≤10

9 .【資料規模】

對於50%的資料中,滿足1<=n<=1000;

對於100%的資料中,滿足1<=n<=100000。

輸出格式:

輸出僅一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間用空格隔開。

輸入樣例#1:

複製

3

2 6 6

1 4 8

輸出樣例#1:

複製

3 6 7

每個組合數都必須有乙個a序列的數和乙個b序列的數

以a序列為例,每個數的第乙個最優組合都是和b序列的第乙個,開乙個從小到大的優先佇列,儲存這n個數,每次彈出乙個,第一次彈出的數所對應的b序列中的數必定是b序列中的第乙個,那這個a序列中的數的最優組合就變成了加上b序列的第二個數(第乙個數已經選過了),將這個數加入優先佇列,出n個,就ok

#includeusing namespace std;

const int maxn = 100000 + 10;

int a[maxn] , b[maxn];

struct f

;bool operator <(const f &a , const f &b)

priority_queueque;

int main()

for(int i = 1; i <= n ; i ++)

printf("%d" , temp.zhi);

if(i != n)

printf(" ");

}return 0;

}

P1631 序列合併

做法 將 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 正確性 我們先把每行的頭扔進堆裡,每行的頭是每行中的最小值,所以這樣我們能在堆裡...

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