n个最小和

给出两个包含 n n 个整数的数组 A A B B

分别在 A A , B B 中任意出一个数并且相加,可以得到 n 2 n^2 个和。

求这些和中最小的 n n 个。

输入格式

输入第一行一个整数 n ( 1 n 50000 ) n(1 \le n \le 50000)

接下来一行输入数组 A A ,用空格隔开。

接下来一行输入数组 B B ,用空格隔开。

1 A i , B i 1 0 9 1 \le A_i, B_i \le 10^9

输出格式

从小到大输出最小的 n n 个和,用空格隔开。

样例输入

4

1 3 5 7

2 4 6 8

样例输出

3 5 5 7

第一种方法AC不过,内存超了,但是思想简单,直接将所有的而结果加起来放到队列中,从小到大排列就行了
#include <iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std; 
int main() {
	int n;
	priority_queue <int,vector<int>,greater<int> > q;
	cin>>n;
	int x,y;
	vector<int> a;
	vector<int> b;
	for(int i=0;i<n;i++)
	{
		cin>>x;
		a.push_back(x);
	}
	sort(a.begin(),a.begin()+n);
	for(int i=0;i<n;i++)
	{
		cin>>y;
		b.push_back(y);
	}
	sort(b.begin(),b.begin()+n);
	for(int i=0;i<a.size();i++)
	{
		for(int j=0;j<a.size();j++)
		{
			q.push(a[i]+b[j]);
		}
		
	}
	cout<<q.top();
	q.pop();
	for(int i=1;i<n;i++)
	{
		cout<<" ";
		cout<<q.top();
		q.pop();
	}
	return 0;
}
这种方法就是分部处理,逐一找出最小的
#include <iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std; 
struct Node
{
	int j,k;
	int total;
	bool operator<(const Node &a)const
	{
		return a.total<total;
	}
};
int main() {
	int n;
	priority_queue <Node> q;
	cin>>n;
	int x,y;
	Node temp;
	vector<int> a;
	vector<int> b;
	for(int i=0;i<n;i++)
	{
		cin>>x;
		a.push_back(x);
	}
	sort(a.begin(),a.begin()+n); //将第一个数组进行排序 
	for(int i=0;i<n;i++)
	{
		cin>>y;
		b.push_back(y);
	}
	sort(b.begin(),b.begin()+n); //将第二个数组进行排序 
	
	for(int i=0;i<a.size();i++)   //首先将n个数据进入队列 
	{
		temp.j=0;
		temp.k=i;
		temp.total=a[temp.j]+b[temp.k];
		q.push(temp);
	}
	bool flag=false;
	for(int i=0;i<n;i++)
	{
		temp=q.top();  
		if(flag==false)
		{
			cout<<temp.total;
			q.pop();
			flag=true;
		}
		else
		{
			cout<<" ";
			cout<<temp.total;
			q.pop();
		}
		temp.j++;
		temp.total=a[temp.j]+b[temp.k];
		q.push(temp);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wait_13/article/details/86632394