题目链接:http://poj.org/problem?id=2442
题目大意:m行数字每行那个,从每行选一个,组成的sum最小。
题目分析:由于是学长提示用堆,所以也就试了这个方法,nlongn
关于更多的知识来:点击打开链接
就是对容器中几个函数的原理解释。先学习下,在用这个
资料链接:
http://blog.csdn.net/morewindows/article/details/6709644
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
int data[2005],num_1[2005],num_2[2005],sum[2005];
void copy(int *a ,int *b,int n)
{
for(int i=0; i<n; i++)
a[i] = b[i];
}
int main()
{
int n,m,t,i,j,k;
scanf("%d",&t);
while(t--)
{
memset(num_1,0,sizeof(num_1));
scanf("%d%d",&m,&n);
for(i=0; i<n; i++)
scanf("%d",&num_1[i]);
for(j=1; j<m; j++)
{
for(i=0; i<n; i++)
scanf("%d",&num_2[i]);
sort(num_1,num_1+n);
sort(num_2,num_2+n);
for(i=0;i<n;i++)
sum[i]=num_1[0]+num_2[i];
make_heap(sum,sum+n);
for(k=1;k<n;k++)
for(i=0;i<n;i++)
{
int tmp=num_1[k]+num_2[i];
if(tmp>=sum[0]) break;
pop_heap(sum,sum+n);
sum[n-1]=tmp;
push_heap(sum,sum+n);
}
copy(num_1,sum,n);
}
sort(num_1,num_1+n);
for(i = 0;i < n; ++ i)
printf("%s%d", i == 0 ? "" : " ", num_1[i]);
printf("\n");
}
return 0;
}