/*此题思想是通过一个优先队列来完成需要不断维护的一个固定长度有序的序列,优先队列大大减少了很多操作*/
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int a[3000];
int main()
{
int t;
while(scanf("%d", &t) != EOF){
while(t--){
int n, m, x;
priority_queue <int >q;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
if(i == 0){
for(int j = 0; j < m; j++){
scanf("%d", &x);
q.push(x);
}
}
else{
for(int j = 0; j < m; j++){
a[j] = q.top();
q.pop();
}
for(int j = 0; j < m; j++){
scanf("%d", &x);
for(int k = m-1; k >= 0; k--){
if(j == 0){
q.push(a[k]+x);
}
else{
if(a[k]+x <= q.top()){
q.push(a[k]+x);
q.pop();
}
else
break; //最小的大于队列最小的直接结束
}
}
}
}
}
for(int i = m-1; i >= 0; i--){
a[i] = q.top();
q.pop(); //别忘记清空队列
}
for(int i = 0; i < m-1; i++)cout << a[i] << " ";
cout << a[m-1] << endl;
}
}
return 0;
}
poj2442(优先队列完成贪心思想)
最新推荐文章于 2019-10-08 13:01:35 发布