STL--F - Sequence(n*m->求最小的前m個和)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   strong   io   

F - SequenceTime Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64uSubmit Status

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

感謝http://www.cnblogs.com/372465774y/archive/2012/07/09/2583866.html

做這個題首先思考兩個問題



由這兩個得出,要求n個數組每個數組m個值,數組1和數組2的和找出最小的m個,再用來和數組3求和,找到最小的m個,最終得到所有的數組中的最小的m個

由於每個數組都是有序的,而且我們要求的最小的m個,數組a[i][j]+隊列中的值 > 隊首的值,那麼a[i][j]加上隊列中以後的值都會大於隊首,對於我們要求解的最小的m個值無意義。隊列中儲存了當前數組到之前所有數組的最小的m個和,不斷更新隊列

#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;int a[110][2100] , b[2100] ;priority_queue <int> p ;int main(){    int i , j , k , n , m , t ;    scanf("%d", &t);    while(t--)    {        scanf("%d %d", &n, &m);        for(i = 0 ; i < n ; i++)        {            for(j = 0 ; j < m ; j++)                scanf("%d", &a[i][j]);            sort(a[i],a[i]+m);        }        for(i = 0 ; i < m ; i++)            p.push(a[0][i]) ;        for(i = 1 ; i < n ; i++)        {            for(j = 0 ; j < m ; j++)            {                b[j] = p.top();                p.pop();            }            for(j = 0 ; j < m ; j++)            {                for(k = m-1 ; k >= 0 ; k--)                {                    if(j == 0)                        p.push( a[i][j]+b[k] );                    else                    {                        if( a[i][j] + b[k] < p.top() )                        {                            p.pop();                            p.push(a[i][j]+b[k]);                        }                        else                            break;                    }                }            }        }        for(j = 0 ; j < m ; j++)        {            b[j] = p.top();            p.pop();        }        for(j = m-1 ; j >= 0 ; j--)        {            if(j == 0)                printf("%d\n", b[j]);            else                printf("%d ", b[j]);        }    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.