Sequence(POJ2442 k小堆问题)

来源:互联网 发布:数字化校园软件 编辑:程序博客网 时间:2024/06/06 02:00
Sequence
Time Limit: 6000MS Memory Limit: 65536KTotal Submissions: 10071 Accepted: 3321

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

题意:每行中取一个数,求和。取最小的n个和。
堆的使用还有很多玄妙,尚未领悟。
#include <cstdio>  #include <cstdlib>  #include <iostream>  #include <algorithm>  #include <cstring>  #include <cmath>  #include <queue>  using namespace std;priority_queue<int>que;int m, n;int num[110][2200];int a[2200];int main(){ int T;scanf("%d", &T);while (T--){scanf("%d%d", &m, &n);for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){scanf("%d", &num[i][j]);}}if (m >= 2){int sum1 = 0, sum2 = 0;for (int i = 1; i <= n; i++)sum1 += num[1][i];for (int i = 1; i <= n; i++)sum2 += num[2][i];if (sum1>sum2)swap(num[1], num[2]);}for (int i = 1; i <= n; i++){que.push(num[1][i]);}for (int i = 2; i <= m; i++){sort(num[i] + 1, num[i] + 1 + n);for (int j = 1; j <= n; j++){a[j] = que.top();que.pop();}for (int j = 1; j <= n; j++){que.push(num[i][1] + a[j]);}for (int j = 2; j <= n; j++){for (int k = n; k >= 1; k--)if (num[i][j] + a[k]<que.top()){que.pop();que.push(num[i][j] + a[k]);}else{break;}}}for (int i = 1; i <= n; i++){a[i] = que.top();que.pop();}for (int i = n; i >= 2; i--){printf("%d ", a[i]);}printf("%d\n", a[1]);}}
转载地址:http://blog.csdn.net/u011775691/article/details/28644411

原创粉丝点击