简化版,只有两个数组
A1+B1 <= A1+B2 <= …
A2+B1 <= A2+B2 <= …
An+B1 <= An+B2 <= …
n个元素放入堆中,记录和s与B的下标
#include<bits/stdc++.h>
using namespace std;
#define N 755
int k;
int read() {
int n;
scanf("%d",&n);
return n;
}
int s[N][N];
int res[N];
struct node {
int num,id;
node (int num,int id) {
this -> num = num;
this -> id = id;
}
bool operator<(const node& rhs)const {
return this -> num > rhs . num;
}
};
void merge(int *a,int *b,int *C) {
int cnt=0;
priority_queue<node> q;
for(int i=0; i<k; i++) {
q.push(node(a[i]+b[0],0));
}
while(!q.empty()) {
node tmp=q.top();
q.pop();
C[cnt++]=tmp.num;
if(tmp.id+1<k)
q.push(node(tmp.num + (b[tmp.id+1] - b[tmp.id]),tmp.id+1));
if(cnt==k)break;
}
}
int main() {
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
while(scanf("%d",&k)!=EOF) {
for(int i=0; i<k; i++) {
for(int j=0; j<k; j++) {
s[i][j]=read();
}
sort(s[i],s[i]+k);
}
memcpy(res,s[0],sizeof(res));
for(int i=1; i<k; i++) {
merge(res,s[i],res);
}
for(int i=0;i<k-1;i++){
printf("%d ",res[i]);
}
printf("%d\n",res[k-1]);
}
return 0;
}