• Sequence


    题目链接:http://dsalgo.openjudge.cn/binarytree/12/

    总时间限制: 3000ms 内存限制: 65536kB
    描述

    给定m个数字序列,每个序列包含n个非负整数。我们从每一个序列中选取一个数字组成一个新的序列,显然一共可以构造出n^m个新序列。接下来我们对每一个新的序列中的数字进行求和,一共会得到n^m个和,请找出最小的n个和

    输入
    输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入
    每个测试用例输入的第一行是两个正整数m(0 < m <= 100)和n(0 < n <= 2000),然后有m行,每行有n个数,数字之间用空格分开,表示这m个序列
    序列中的数字不会大于10000
    输出
    对每组测试用例,输出一行用空格隔开的数,表示最小的n个和
    样例输入
    1
    2 3
    1 2 3
    2 2 3
    样例输出
    3 3 4

    分析:

    这个题用优先队列来处理。维护一个长度为n的优先队列,每次输入后都对前n个最小和进行更新,m-1次迭代后得到最终的前n个最小和。

    优先队列内部是用堆来实现的,若是水平高的童鞋可以自己实现堆去试一下。

    下面直接使用C++ STL的优先队列来完成工作。

    关于优先队列可以参考:https://www.cnblogs.com/huashanqingzhu/p/11040390.html

    关于sort排序函数参考:https://www.cnblogs.com/TX980502/p/8528840.html

    AC代码如下:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <queue>
     5 #include <algorithm>
     6 using namespace std;
     7  
     8 const int maxn = 2005;
     9 int t,m,n,a[maxn],b[maxn];
    10 priority_queue<int> q;//利用a维护前n个最小和
    11  
    12 int main()
    13 {
    14     scanf("%d",&t);
    15     while(t--) {
    16         scanf("%d%d",&m,&n);
    17         for (int i = 0; i < n; ++i) scanf("%d",&a[i]);sort(a,a+n);    //a存储前n个最小和
    18         m--;
    19         while(m--) {
    20             for (int i = 0; i < n; ++i) scanf("%d",&b[i]);sort(b,b+n);
    21             for (int i = 0; i < n; i++) q.push(a[i]+b[0]);    //生成长度为n的优先队列
    22             for (int i = 1; i < n; ++i)    {    //计算剩余的组合,并更新队列
    23                 int j;
    24                 for (j = 0; j < n; ++j)
    25                     if(b[i]+a[j]<q.top()) q.pop(),q.push(b[i]+a[j]);//a剪枝
    26                     else break;
    27                 if(j == 0) break;//b剪枝,b[i]+a[0]都不行,那b[i+1]+a[0]或b[i]+a[1]也不行
    28             }    
    29             for (int i = n-1; i >= 0; i--) a[i] = q.top(),q.pop();    //为下次更新作准备
    30         }
    31         for (int i = 0; i < n; i++) printf("%d%c",a[i],i == n-1?'
    ':' ');
    32     }
    33     return 0;
    34 }
    View Code

    代码来自csdn:https://blog.csdn.net/xxiaobaib/article/details/78907588

  • 相关阅读:
    LINQTOSQL作为底层ORM框架后,我们的数据基类就变成了这个样子
    一個傳統的C2C網站的用戶充值的过程
    ajax跨域获取数据
    C#+HTML+JS生成的树完整代码
    核心Swing组件(六)
    Swing组件集合的事件处理(六)
    Swing组件集合的事件处理(四)
    核心Swing组件(四)
    核心Swing组件(三)
    核心Swing组件(五)
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/11040709.html
Copyright © 2020-2023  润新知