Sequence
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 8855 | Accepted: 2937 |
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
// 一开始a[]开小了, 叫了两发runtime error
// 用优先队列时注意内存
#include<iostream> #include<string.h> #include<stdio.h> #include<math.h> #include<algorithm> #include<queue> #include<vector> using namespace std; int main() { int t, n, m, x,a[20001]; scanf("%d", &t); while(t--) { scanf("%d%d", &n,&m); priority_queue< int , vector<int> , greater<int> >qq; priority_queue< int , vector<int> , less<int> >p; for(int i = 0; i<n; ++i) { if(!i) { for(int j = 0; j<m; ++j) { scanf("%d", &x); qq.push(x); } } else { for(int j = 0; j<m; ++j) a[j] = qq.top(), qq.pop(); while(!qq.empty())qq.pop(); for(int j = 0; j<m; ++j) { scanf("%d", &x); for(int k = 0; k<m; ++k ) if((int)p.size()<m)p.push(x+a[k]); else if(x+a[k]<p.top()) { p.push(x+a[k]); p.pop(); } } while(p.size()) { qq.push(p.top()); p.pop(); } } } for(int i = 0; i<m; ++i) { printf("%d%c", qq.top(), (i==m-1)?'\n':' '); qq.pop(); } } return 0; }