有兩個長度都為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個最小的和...