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
这个题的意思不是很难理解,关键是思想,一点点算肯定超时了;
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<queue> 6 using namespace std; 7 int main() 8 { 9 int m,n,t,a[2005],b[2005],i,j; 10 priority_queue<int,vector<int>,less<int> >que; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d %d",&m,&n); 15 m--; 16 for(i=0; i<n; i++) 17 scanf("%d",&a[i]); 18 sort(a,a+n); 19 while(m--) 20 { 21 for(i=0; i<n; i++) 22 { 23 scanf("%d",&b[i]); 24 que.push(a[0]+b[i]);//先进去N个 25 } 26 sort(b,b+n);//这个应该会用了 27 for(i=1; i<n; i++) 28 { 29 for(j=0; j<n; j++) 30 { 31 if(a[i]+b[j]>que.top())//因为有sort排序,所以,后面只会更大,可以break; 32 break; 33 que.pop(); 34 que.push(a[i]+b[j]); 35 } 36 } 37 for(i=n-1; i>-1; i--) 38 { 39 a[i]=que.top(); 40 que.pop(); 41 } 42 } 43 printf("%d",a[0]); 44 for(i=1; i<n; i++) 45 printf(" %d",a[i]); 46 printf(" "); 47 } 48 return 0; 49 }