https://vjudge.net/problem/UVA-11997
这题自己又不会了。。。
其实就是给每一行维护一个值,使得每次找的时候都是找的最小值。。
struct Node{
int s,b;
Node(int s,int b):s(s),b(b){};
bool friend operator<(Node a,Node c){
return a.s>c.s;
}
};
void merge(int *A,int *B,int *C){
priority_queue<Node>q;
for(int i=0;i<k;++i){
q.push(Node(A[i]+B[0],0));
}
for(int i=0;i<k;++i){
Node item=q.top();q.pop();
C[i]=item.s;
int b=item.b;
if(b+1<k)q.push(Node(item.s-B[b]+B[b+1],b+1));
}
}
int main(){
while(~sf("%d",&k)){
rep(i,0,k-1)sf("%d",&A[i]);
sort(A,A+k);
for(int i=1;i<k;++i){
for(int j=0;j<k;++j)sf("%d",&B[j]);
sort(B,B+k);
merge(A,B,A);
}
for(int i=0;i<k;++i){
pf("%d%c",A[i],i==k-1?'\n':' ');
}
}
}