一 原题
Sequence
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 10203 | Accepted: 3352 |
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
Source
POJ Monthly,Guang Lin
二 分析
给定一个m行n列的整数矩阵,要求从每一行中取一个数,将得到的m个数求和,这样共有n^m种选法。输出这n^m个和中最小的n个。
维护一个ans数组,表示前k行每行取一个数能得到的最小的n个和。ans有序,利用当前ans和第(k+1)行的数num更新ans数组,更新方法就是维护一个元素个数为n的最大堆。
三 代码
Memory: 296K
Time: 1860MS
Language: C++
Result:
Accepted
/*
AUTHOR: maxkibble
LANG: C++
PROB: poj 2442 Sequence
*/
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxm = 105;
const int maxn = 2005;
int n, m, num[maxn], ans[maxn];
priority_queue<int> q;
void solve() {
cin >> m >> n;
for(int i = 0; i < n; i++) {
cin >> num[i];
}
sort(num, num + n);
memcpy(ans, num, sizeof(num));
for(int i = 1; i < m; i++) {
for(int i = 0; i < n; i++) {
cin >> num[i];
}
sort(num, num + n);
while(!q.empty()) q.pop();
for(int i = 0; i < n; i++) {
q.push(ans[0] + num[i]);
}
for(int i = 1; i < n; i++) {
for(int j = 0; j < n; j++) {
int val = ans[i] + num[j];
if(val > q.top())
break;
if(val < q.top()) {
q.pop();
q.push(val);
}
}
}
for(int i = n - 1; i >= 0; i--) {
ans[i] = q.top();
q.pop();
}
}
cout << ans[0];
for(int i = 1; i < n; i++)
cout << " " << ans[i];
cout << endl;
}
int main() {
ios::sync_with_stdio(false);
int kase;
cin >> kase;
while(kase--) {
solve();
}
return 0;
}