poj 2442 Sequence
来源:互联网 发布:中国女人崇洋媚外 知乎 编辑:程序博客网 时间:2024/05/16 03:26
一 原题
Sequence
Time Limit: 6000MS Memory Limit: 65536KTotal 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
12 31 2 32 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: maxkibbleLANG: 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;}
阅读全文