最小n个和(优先队列)
Posted 要有梦想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小n个和(优先队列)相关的知识,希望对你有一定的参考价值。
给出两个包含 nn 个整数的数组 AA,BB。分别在 AA, BB 中任意出一个数并且相加,可以得到 n^2n2个和。求这些和中最小的 nn 个。
输入格式
输入第一行一个整数 n(1 \le n \le 50000)n(1≤n≤50000)。
接下来一行输入数组 AA,用空格隔开。
接下来一行输入数组 BB,用空格隔开。
1 \le A_i, B_i \le 10^91≤Ai?,Bi?≤109
输出格式
从小到大输出最小的 nn 个和,用空格隔开。
样例输入
4
1 3 5 7
2 4 6 8
样例输出
3 5 5 7
#include<iostream> #include<algorithm> #include<queue> using namespace std; int n,a[100001],b[100001]; struct node{ int y,num; bool operator <(const node &v)const { return num>v.num; } }; node k; priority_queue<node>q; int main() { 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++) { k.y=1; k.num=a[i]+b[1]; q.push(k); } int s=1; while(s<=n) { node now=q.top(); q.pop(); if(now.y+1<=n) { k.y=now.y+1; k.num=now.num-b[now.y]+b[now.y+1]; q.push(k); }s++; cout<<now.num<<" "; } return 0; } //AC #include<iostream> #include<queue> #include<algorithm> using namespace std; int a[100005],b[100005],c[100005];int n;; struct data{ int aa,bb,c; }o[100005],z; bool operator<(data x,data y) { return x.c>y.c; } priority_queue<data> q; int main() { cin>>n;int l1=1,l2=1; for (int i=1;i<=n;++i) { cin>>a[i]; } sort(a+1,a+1+n); for (int i=1;i<=n;++i) { cin>>b[i]; } sort(b+1,b+1+n); for (int i=1;i<=n;++i) { o[i].aa=1; o[i].bb=i; o[i].c=a[o[i].aa]+b[o[i].bb]; q.push(o[i]); } for (int i=1;i<=n;++i) { z=q.top(); q.pop(); cout<<z.c; if(i!=n)cout<<" "; z.aa++; z.c=a[z.aa]+b[z.bb]; q.push(z); } }
以上是关于最小n个和(优先队列)的主要内容,如果未能解决你的问题,请参考以下文章