K Smallest Sums
题意:有k个数组,每个有k个元素,在每个数组里面取一个数加起来,问最小的k个数。
思路:多路归并,优先队列维护。
#include<bits/stdc++.h>
using namespace std;
int a[755][755];
int n;
struct node{
int s,b;
node(int s,int b):s(s),b(b){}
bool operator < (const node& a)const{
return a.s<s;
}
};
void merage(int* a,int* b,int* c){
priority_queue<node>q;
for(int i=0;i<n;i++)
q.push(node(a[i]+b[0],0));
for(int i=0;i<n;i++){
node t=q.top();
q.pop();
c[i]=t.s;
int bb=t.b;
if(bb+1<n)
q.push(node(t.s-b[bb]+b[bb+1],bb+1));
}
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
sort(a[i],a[i]+n);
}
for(int i=1;i<n;i++)
merage(a[0],a[i],a[0]);
for(int i=0;i<n-1;i++)
printf("%d ",a[0][i]);
printf("%d\n",a[0][n-1]);
}
}