Description
Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can calculate the sum of numbers in each sequence, and get n ^ m values. What we need is the smallest n sums. Could you help us?
Input
The first line is an integer T, which shows the number of test cases, and then T test cases follow. The first line of each case contains two integers m, n (0 < m <= 100, 0 < n <= 2000). The following m lines indicate the m sequence respectively. No integer in the sequence is greater than 10000.
Output
For each test case, print a line with the smallest n sums in increasing order, which is separated by a space.
Sample Input
1 2 3 1 2 3 2 2 3
Sample Output
3 3 4
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
using namespace std;
int main()
{
priority_queue<int>q;
int t,i,j,k;
int n,m;
int a[110][2050];
int b[2050];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&m,&n);
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d",&a[i][j]);
}
sort(a[i],a[i]+n);
}
for(i = 0 ; i < n ; i++)
q.push(a[0][i]);
for(i = 1; i < m; i++)
{
for(j = 0; j < n; j++)
{
b[j] = q.top();
q.pop();
}
for(j=0; j<n; j++)
{
for(k=n-1; k>=0; k--)
{
if(j==0)
{
q.push(a[i][j]+b[k]);
}
else
{
int he=a[i][j]+b[k];
int bi=q.top();
if(bi>he)
{
q.pop();
q.push(he);
}
}
}
}
}
for(j = 0; j < n; j++)
{
b[j] = q.top();
q.pop();
}
printf("%d",b[n-1]);
for(i = n-2; i>=0; i--)
printf(" %d",b[i]);
printf("\n");
}
return 0;
}
下面是用堆来写
male_heap就是构造一棵树,使得每个父结点均大于等于其子女结点
pop_heap不是删除某个元素而是把第一个和最后一个元素对调后[first,end-1]进行构树,最后一个不进行构树
push_heap是对容器内的元素再进行排序形成一个新的堆
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define Max 2008
using namespace std;
int sum[Max],data[Max],Q[Max];
int main()
{
int i,j,k,t,m,n,temp;
scanf("%d",&t);
while(t--)
{
memset(sum,0,sizeof(sum));
scanf("%d %d",&m,&n);
for(i=0; i<n; i++)
scanf("%d",&sum[i]);
for(i=1; i<m; i++)
{
memset(data,0,sizeof(data));
//sort(sum,sum+n);
for(j=0; j<n; j++)
scanf("%d",&data[j]);
sort(data,data+n);
for(j=0; j<n; j++)
Q[j]=sum[0]+data[j];
make_heap(Q,Q+n);
for(j=1; j<n; j++)
{
for(k=0; k<n; k++)
{
temp=sum[j]+data[k];
if(temp>=Q[0])
break;
pop_heap(Q,Q+n);
Q[n-1]=temp;
push_heap(Q,Q+n);
}
}
for(j=n-1; j>=0; j--)
sum[j]=Q[j];
}
sort(sum,sum+n);
for(j=0; j<n-1; j++)
printf("%d ",sum[j]);
printf("%d\n",sum[n-1]);
}
return 0;
}