zoukankan      html  css  js  c++  java
  • STL--F

    F - Sequence
    Time Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
    Submit 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

    1
    2 3
    1 2 3
    2 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
    ", b[j]);
                else
                    printf("%d ", b[j]);
            }
        }
        return 0;
    }
    


    版权声明:转载请注明出处:http://blog.csdn.net/winddreams

  • 相关阅读:
    OpenYurt v0.4.0 新特性发布:高效地管理边缘存储资源
    OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能
    dubbo-go v3 版本 go module 踩坑记
    阿里云携手 VMware 共建云原生 IoT 生态,聚开源社区合力打造领域标准
    一文告诉你Java日期时间API到底有多烂
    LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你
    全球城市ZoneId和UTC时间偏移量的最全对照表
    全网最全!彻底弄透Java处理GMT/UTC日期时间
    GMT UTC CST ISO 夏令时 时间戳,都是些什么鬼?
    如何保证Redis高可用和高并发
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4731914.html
Copyright © 2011-2022 走看看