https://vjudge.net/problem/UVA-11997
利用优先队列,先求两个数组之间最小和,再循环求k次,只看队首元素即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 800
int a[maxn][maxn];
using namespace std;
struct node
{
int sum,id;
node(int sum,int id):sum(sum),id(id){}
bool operator<(const node&a)const
{
return sum>a.sum;
}
};
void merge(int *a,int *b,int *c,int n)
{
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 temp=q.top();
q.pop();
c[i]=temp.sum;
if(temp.id+1<n)
q.push(node(temp.sum-b[temp.id]+b[temp.id+1],temp.id+1));
}
}
int main()
{int k;
while(~scanf("%d",&k))
{
for(int i=0;i<k;i++)
{for(int j=0;j<k;j++)
scanf("%d",&a[i][j]);
sort(a[i],a[i]+k);
}
for(int i=1;i<k;i++)
merge(a[0],a[i],a[0],k);
printf("%d",a[0][0]);
for(int i=1;i<k;i++)
printf(" %d",a[0][i]);
printf("\n");
}
return 0;
}