【蓝桥杯-优先队列排序】n个最小和

给出两个包含 nn 个整数的数组 AABB。分别在 AABB 中任意出一个数并且相加,可以得到 n^2n2个和。求这些和中最小的 nn 个。

输入格式

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

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

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

1 \le A_i, B_i \le 10^91Ai,Bi109

输出格式

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

样例输入
4
1 3 5 7
2 4 6 8
样例输出
3 5 5 7

#include<iostream>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
const int mmax=50010;
int A[mmax],B[mmax];
struct Item
{
	int s,b;
	Item(int s,int b):s(s),b(b){}
	bool operator < (const Item &b) const
	{
		return s>b.s;
	}
 } 
 
 priority_queue<Item> q;
 int main()
 {
 	int n;
 	cin>>n;
 	for(int i=0;i<n;i++)
 	{
 		cin>>A[i];
	}
	for(int i=0;i<n;i++)
	{
		cin>>B[i];
	}
	sort(A,A+n);
	sort(B,B+n);
	for(int i=0;i<n;i++)
	{
		q.push(Item(A[i]+B[0],0));
	}
	for(int i=0;i<n;i++)
	{
		Item item=q.top();
		q.pop();
		cout<<item.s;
		if(i!=n-1)
			cout<<" ";
		int b=item.b;
		if(b+1<n)
			q.push(Item(item.s-B[b]+B[b+1],b+1));
	}
	return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值