这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
小思老师和小爱老师经常会结伴一起去超市购物,
一天她们分别买了东西放在2个购物车(分别记为A车、B车)里,
A、B里都有n件商品。
这时她们突然想到,
从A,B中可以分别挑出任意一件商品,
并将价格相加,
这样总共得到n*n个和。
她们想知道这些和中最小的n个分别是多少。
第一行,一个整数n (1<=n<=50000)
接下来2行,每行都有n个正整数,
用空格隔开,
每个正整数最大值不会超过10^9 。
n行,每行一个数字,表示从小到大最小的n个和
- 4
- 1 3 5 7
- 2 4 6 8
- 3
- 5
- 5
- 7
本题线下文件测评时的说明:
- 可执行文件名:price
- 提交源程序文件名:price.cpp
- 输入文件名:price.in
- 输出文件名:price.out
- 时间限制:1秒
- 空间限制:256MB
- #include
- 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
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<
'\n'; - cnt[cur.id]++;
- cur.val=a[cur.id]+b[cnt[cur.id]];
- q.push(cur);
- }
- return 0;
- }