#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int a[5000],b[5000],a1[3000],c;
priority_queue<int> q;
int main()
{
int t,i,j,m,n,temp;
cin>>t;
while(t--)
{
i=0;
cin>>m>>n; //while(m--)这种写法好是好,但是m的值会因此改变
for(i=0;i<n;i++)
cin>>a[i];
m--;
while(m--)
{
for(i=0;i<n;i++) //第一次这样写,思路是两两相加,取前n个和下一行相加,这样既减少了复杂度,又能避免开二维数组
cin>>b[i];
sort(b,b+n);
for(i=0;i<n;i++) //for(i=0;i<n;i++)
a1[i]=a[i]+b[0]; // for(j=0;j<n;j++)
for(i=0;i<n;i++)
q.push(a1[i]);
sort(a,a+n);
for(i=1;i<n;i++) //c[k++]=a[i]+b[j];
{
temp=0;
for(j=0;j<n;j++) // sort(c,c+n*n);
{
c=a[j]+b[i];
if(c<q.top())
{
q.pop();
q.push(c);
temp=1;
}
else
break;
}
if(temp==0)
break;
}
i=0;
while(!q.empty())
{
a[i++]=q.top();
q.pop();
}
}
sort(a,a+n);
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[i]<<endl;
}
}
poj 2442 优先队列 复杂度用了两个break 降到了m*n*log(n)
最新推荐文章于 2024-04-22 15:18:52 发布