有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到\(N^2\)个和,求这\(N^2\)个和中最小的N个。
3
2 6 6
1 4 8
3 6 7
\(a_1\) ???3??6??10
\(a_2\)???7??10??14
\(a_3\)???7??10??14
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn],b[maxn];
struct node{
int a,b,v;
node(int ta,int tb,int tv){
a = ta;
b = tb;
v = tv;
}
bool operator <(const node &A)const{
return v > A.v;
}
};
priority_queue<node> q;
int main(){
int n;scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
for(int i = 1;i <= n;++i)scanf("%d",&b[i]);
for(int i = 1;i <= n;++i){
q.push(node(i,1,a[i] + b[1]));
}
for(int i = 1;i <= n;++i){
int ta = q.top().a;
int tb = q.top().b;
int tv = q.top().v;
q.pop();
printf("%d ",tv);
q.push(node(ta,tb + 1,a[ta] + b[tb + 1]));
}
return 0;
}
原文:https://www.cnblogs.com/2004-08-20/p/13369922.html