POJ 2442Sequence

来源:互联网 发布:非典生化武器知乎 编辑:程序博客网 时间:2024/06/08 01:16

Sequence

Time Limit: 6000MS Memory Limit: 65536KTotal Submissions: 9144 Accepted: 3046

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

题意:给n行m列,从每行中选出一个数字,n个数字的和sum,有n的m次方个sum,对sum升序,输出前n个sum。

题解:用到优先队列。

#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <queue>using namespace std;int main(){    int K;    int i, j, k, n, m;    int a[2010], b[2010];    scanf("%d", &K);    while(K--)    {        cin>>n>>m;        for(i = 0; i < m; i++)        {            scanf("%d", &a[i]);        }        sort(a, a + m);//对第一行升序。        for(i = 1; i < n; i++)        {            priority_queue<int, vector<int>, less<int> >q;//大的靠近队列的头。            for(j = 0; j < m; j++)            {                scanf("%d", &b[j]);            }            for(j = 0; j < m; j++)//将a中的最小值和b相加,确定临时的最小sum队列            {                q.push(a[0] + b[j]);            }            for(j = 1; j < m; j++)//挨个比较选出a和b中最小的n个sum。            {                for(k = 0; k < m; k++)                {                    if(a[j] + b[k] < q.top())                    {                        q.pop();                        q.push(a[j] + b[k]);                    }                }            }            for(j = 0; j < m; j++)//把最小的n个sum赋值给a,下个循环再用。            {                a[j] = q.top();                q.pop();            }            sort(a, a + m);        }        for(i = 0; i < m; i++)        {            if(i == m - 1)                printf("%d\n", a[i]);            else                printf("%d ", a[i]);        }    }    return 0;}


0 0