• POJ 2442 Sequence(堆)


    Sequence

    题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列,让你求出序列和最小的前n个序列的序列和。

    思路:

    1.将第一序列读入a向量中,并按升序排序。

    2.将数据读入b向量中,并按升序排序。

        将a[0] + b[i] ( 0<=i<=n-1)读入p向量中

        建堆。

        然后b[1] + a[i] (0<=i<=n-1),如果b[1] + a[i]比堆p的顶点大,则退出,否则删除

        堆的顶点,插入b[1] + a[i]。然后是b[2],...b[n - 1]

    3.将p的数据拷贝到a中,并对a按升序排序

    4.循环2,3步,直到所有数据读入完毕。

    5.打印a中的数据即为结果。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <queue>
     4 #include <stdio.h>
     5 using namespace std;
     6 
     7 void Solve()
     8 {
     9     int a[2010], b[2010];
    10     int t;
    11     int n, m;
    12     priority_queue<int,deque<int>,less<int> >p;
    13     scanf("%d", &t);
    14     while(t--)
    15     {
    16         scanf("%d%d", &m, &n);
    17         for(int i = 0; i < n; i++)
    18             scanf("%d", &a[i]);
    19         sort(a, a+n);
    20         for(int i = 1; i < m; i++)
    21         {
    22             for(int j = 0; j < n; j++)
    23             {
    24                 scanf("%d", &b[j]);
    25                 p.push(a[0]+b[j]);
    26             }
    27             sort(b, b+n);
    28             for(int j = 1; j < n; j++)
    29             {
    30                 for(int k = 0; k < n; k++)
    31                 {
    32                     if(a[j]+b[k] > p.top())
    33                         break;
    34                     p.pop();
    35                     p.push(a[j]+b[k]);
    36                 }
    37             }
    38             for(int j = 0; j < n; j++)
    39             {
    40                 a[n-j-1] = p.top();
    41                 p.pop();
    42             }
    43         }
    44         for(int i = 0; i < n-1; i++)
    45             printf("%d ", a[i]);
    46         printf("%d
    ", a[n-1]);
    47     }
    48 }
    49 
    50 int main(void)
    51 {
    52     Solve();
    53 
    54     return 0;
    55 }
    Sequence
  • 相关阅读:
    办公自动化15-一次性生成多层目录
    小技巧1-查看excel中工作表(sheet)的个数
    LaTex 公式编辑
    Cpp 学习网站
    函数的凹凸性
    二项分布
    函数间断点
    霍夫丁(Hoeffding)不等式
    数域
    马尔可夫(Markov)不等式
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3488147.html
Copyright © 2020-2023  润新知