题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列,让你求出序列和最小的前n个序列的序列和。
思路:
1.将第一序列读入a向量中,并按升序排序。
2.将数据读入b向量中,并按升序排序。
将a[0] + b[i] ( 0<=i<=n-1)读入p向量中
建堆。
然后b[1] + a[i] (0<=i<=n-1),如果b[1] + a[i]比堆p的顶点大,则退出,否则删除
堆的顶点,插入b[1] + a[i]。然后是b[2],...b[n - 1]
3.将p的数据拷贝到a中,并对a按升序排序
4.循环2,3步,直到所有数据读入完毕。
5.打印a中的数据即为结果。
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
void Solve()
{
int a[2010], b[2010];
int t;
int n, m;
priority_queue<int,deque<int>,less<int> >p;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &m, &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
for(int i = 1; i < m; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d", &b[j]);
p.push(a[0]+b[j]);
}
sort(b, b+n);
for(int j = 1; j < n; j++)
{
for(int k = 0; k < n; k++)
{
if(a[j]+b[k] > p.top())
break;
p.pop();
p.push(a[j]+b[k]);
}
}
for(int j = 0; j < n; j++)
{
a[n-j-1] = p.top();
p.pop();
}
}
for(int i = 0; i < n-1; i++)
printf("%d ", a[i]);
printf("%d\n", a[n-1]);
}
}
int main(void)
{
Solve();
return 0;
}