算法筆記---序列合併

題目描述

有兩個長度都爲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個最小的和,相鄰數字之間用空格隔開。

樣例:

輸入:
3
2 6 6
1 4 8
輸出:
3 6 7

解題思路:
使用最小堆求解
定義一個優先級隊列,因爲 stl 庫中的優先級隊列默認爲大頂堆,故定義小頂堆的時候需要指出 比較方式

priority_queue<Type, Container, Functional>
Type: 存儲類型
Container: 存儲容器,一般爲vector或者deque
Functional: 比較方式

定義一個小頂堆:

priority_queue<int, vector<int>, greater<int> > res;//小頂堆

然後兩層循環遍歷A序列和B序列,將A[i] + B[j] 放入小頂堆,然後打印小頂堆的前N個數即可。

下面爲AC代碼:

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

int main() {
	int n;
	cin >> n;//共有多少個數
	int data;
	vector<int> v1,v2;
	priority_queue<int, vector<int>, greater<int> > res;//小頂堆
	for (int i = 0;i < n;i++)
	{
		cin >> data;
		v1.push_back(data);
	}
	for (int i = 0;i < n;i++)
	{
		cin >> data;
		v2.push_back(data);
	}
	sort(v1.begin(), v1.end());
	sort(v2.begin(), v2.end());
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;(i * j) <= n;j++)
		{
			res.push(v1[i - 1] + v2[j - 1]);
		}
	}
	for (int i = 0;i < n;i++)
	{
		int result = res.top();
		res.pop();
		cout << result << " ";
	}
	//system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章