题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。
输入
第一行一个正整数N;
第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;
第三行N个整数Bi, 满足Bi<=Bi+1且Bi<=10^9.
输出
仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
样例输入
3
2 6 6
1 4 8
样例输出
3 6 7
提示
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
思路:稍微分析一下,优先队列搞一搞;
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> #include<queue> typedef long long ll; using namespace std; priority_queue<ll> q; ll a[100010],b[100010],ans[100010]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) scanf("%lld",&b[i]); for(int i=1;i<=n;i++){ q.push(a[1]+b[i]); } for(int i=2;i<=n;i++){ int p=1; while(b[p]+a[i]<q.top()){//优先队列维护答案 q.pop(); q.push(b[p]+a[i]); p++; } } int cnt=0; while(!q.empty()){ ans[++cnt]=q.top(); q.pop(); } for(int i=cnt;i>=1;i--) printf("%lld%c",ans[i],i==1?' ':' '); return 0; } /* 5 -1 2 3 3 4 -3 -1 0 1 1 4 1 2 4 5 3 5 7 9 */