????????在一个?n?行?m?列的数阵中,你须在每一行取一个数(共 n?个数),并将它们相加得到一个和。对于给定的数阵,请你输出和前?k?小的取数方法。
????????先对一二两行进行处理,取前k小的数,再与下一行运算? ? ? ?用优先队列实现
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[805],b[805],c[805];
struct node{
int x,a,b;
bool operator<(const node &y) const
{ return x>y.x; }
};
priority_queue<node> q;
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
sort(a+1,a+1+m);
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++) scanf("%d",b+j); sort(b+1,b+1+m);
while(!q.empty()) q.pop();
for(int j=1;j<=k;j++) q.push((node){a[j]+b[1],j,1});
for(int j=1;j<=k;j++)
{
node x=q.top(); q.pop(); c[j]=x.x;
if(x.b<m) q.push((node){a[x.a]+b[x.b+1],x.a,x.b+1});
}
for(int j=1;j<=k;j++) a[j]=c[j];
}
for(int i=1;i<=k;i++) cout<<a[i]<<" ";
return 0;
}