前言:
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
题目描述
小思老师和小爱老师经常会结伴一起去超市购物,
一天她们分别买了东西放在2个购物车(分别记为A车、B车)里,
A、B里都有n件商品。
这时她们突然想到,
从A,B中可以分别挑出任意一件商品,
并将价格相加,
这样总共得到n*n个和。
她们想知道这些和中最小的n个分别是多少。
输入描述
第一行,一个整数n (1<=n<=50000)
接下来2行,每行都有n个正整数,
用空格隔开,
每个正整数最大值不会超过10^9 。
输出描述
n行,每行一个数字,表示从小到大最小的n个和
输入样例#1
4
1 3 5 7
2 4 6 8
输出样例#1
3
5
5
7
提示
本题线下文件测评时的说明:
- 可执行文件名:price
- 提交源程序文件名:price.cpp
- 输入文件名:price.in
- 输出文件名:price.out
- 时间限制:1秒
- 空间限制:256MB
完整代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int a[N],b[N];
int cnt[N];
int n;
struct node
{
int id,val;
friend bool operator < (node a,node b)
{
return a.val>b.val;
}
};
priority_queue<node> q;
int main()
{
//freopen("price.in","r",stdin);
//freopen("price.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
cnt[i]=1;
q.push(node{i,a[i]+b[1]});
}
for(int i=1;i<=n;i++)
{
node cur=q.top();
q.pop();
cout<<cur.val<<'\n';
cnt[cur.id]++;
cur.val=a[cur.id]+b[cnt[cur.id]];
q.push(cur);
}
return 0;
}