给出两个包含 个整数的数组 , 。
分别在 , 中任意出一个数并且相加,可以得到 个和。
求这些和中最小的 个。
输入格式
输入第一行一个整数 。
接下来一行输入数组 ,用空格隔开。
接下来一行输入数组 ,用空格隔开。
输出格式
从小到大输出最小的 个和,用空格隔开。
样例输入
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;
}