Description
Input
Output
Sample Input
1 2 3 1 2 3 2 2 3
Sample Output
3 3 4
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int a[200][2100],b[2100];///a数组存输入的数据 可以认为缓存数据 让优先队列的数据存进b来进行相关比较 以便于再有再小的数值存进优先队列
int main()
{
int n,m,t,i,j,k;
scanf("%d",&t);
while(t--)
{
priority_queue<int>q;///优先队列存的是当前m个 最小和
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
q.push(a[0][i]);
}
for(i=1;i<n;i++)
{
for(j=0;j<m;j++)
{
b[j]=q.top();
q.pop();
}
for(j=0;j<m;j++)
{
for(k=m-1;k>=0;k--)
{
if(j==0)
q.push(a[i][j]+b[k]);
else
{
if(a[i][j]+b[k]<q.top())
{
q.pop();
q.push(a[i][j]+b[k]);
}
else
break;///已经排好序<从小到大> 如果a[i][j]+b[k]>=q.top() 后面的就没有必要比了
}
}
}
}
for(i=0;i<m;i++)///排序虽然是从小到大 但是出队时是从队尾出队列 所以下面的for循环i是从m-1开始
{
b[i]=q.top();
q.pop();
}
for(i=m-1;i>=0;i--)
{
i==m-1?printf("%d",b[i]):printf(" %d",b[i]);
}
printf("\n");
}
return 0;
}