題目描述
有兩個長度都爲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;
}