演算法筆記 序列合併

2021-10-05 03:18:03 字數 1185 閱讀 1514

有兩個長度都為n的序列a和b,在a和b中各取乙個數相加可以得到n2個和,求這n2個和中最小的n個。

輸入:第一行乙個正整數n(1 <= n <= 100000)。

第二行n個整數ai,滿足ai <= ai+1且ai <= 109

第三行n個整數bi,滿足bi <= bi+1且bi <= 109

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

樣例:

輸入:32

6614

8輸出:36

7

解題思路:

使用最小堆求解

定義乙個優先順序佇列,因為 stl 庫中的優先順序佇列預設為大頂堆,故定義小頂堆的時候需要指出 比較方式

priority_queue

type: 儲存型別

container: 儲存容器,一般為vector或者deque

functional: 比較方式

定義乙個小頂堆:

priority_queue<

int, vector<

int>

, greater<

int>

> res;

//小頂堆

然後兩層迴圈遍歷a序列和b序列,將a[i] + b[j] 放入小頂堆,然後列印小頂堆的前n個數即可。

下面為ac**:

#include

#include

#include

#include

using

namespace std;

intmain()

for(

int i =

0;i < n;i++

)sort

(v1.

begin()

, v1.

end())

;sort

(v2.

begin()

, v2.

end())

;for

(int i =

1;i <= n;i++)}

for(

int i =

0;i < n;i++

)//system("pause");

return0;

}

有序序列合併

massage 題目描述 輸入兩個公升序排列的序列,將兩個序列合併為乙個有序序列並輸出。輸入描述 輸入包含三行,第一行包含兩個正整數n,m 1 n,m 100 用空格分隔。n表示第二行第乙個公升序序列中數字的個數,m表示第三行第二個公升序序列中數字的個數。第二行包含n個整數 範圍1 5000 用空格...

兩個有序序列的合併演算法

將兩個有序序列合併 merge 為乙個有序序列問題的形式化表示為 輸入 序列a p.r 其中,子串行a p.q 和a q 1.r 是有序的。輸出 a p.r 所有元素的重排,使之有序。用乙個漸增型演算法解決此問題。首先,把a p.q 和a q 1.r 分別複製到序列l 1.n1 和r 1.n2 中,...

序列合併(暴力 剪枝)

題目描述 有兩個長度都是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.輸出僅一行,包含n個整數,從小到大輸出這n個最小的和...