将第一行排序,然后利用 优先队列,然后一行一行来寻找最小值具体看代码
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int a[maxn], b[maxn], c[maxn]; //a数组为一直保存的数组,b为新输入的一行,c为零时数组
typedef pair<int,int> PII;
int z = 0;
int n, m;
void merge()
{
priority_queue<PII, vector<PII>, greater<PII>> heap;
for(int i = 0; i < n; i ++) heap.push({a[0]+b[i],0}); //将新的一行与旧的一行的最小元素分别相加
for(int i = 0; i < n; i ++) //遍历n个元素
{
PII t = heap.top(); //得到最小的那个元素
heap.pop(); //将最小的踢出去
int sum = t.first; //最小元素的值
int p = t.second; //最小元素的位置
c[i] = sum; //将最小元素放入c中
heap.push({sum-a[p]+a[p+1],p+1}); //将下一个元素放入队列
}
for(int i = 0; i < n; i ++) a[i] = c[i];
}
int main()
{
int t;
scanf("%d",&t);
for(int i = 1; i <= t; i ++)
{
scanf("%d%d",&m,&n);
for(int i = 0; i < n; i ++) scanf("%d",&a[i]); //先输入第一行然后排序
sort(a, a+n);
for(int i = 0; i < m-1; i ++)
{
for(int j = 0; j < n; j ++) scanf("%d",&b[j]); //输入新的一行然后执行操作
merge();
}
for(int i = 0; i < n; i ++)
printf("%d ",a[i]);
cout << endl;
}
return 0;
}