首页 > 其他分享 >堆用于维护最大最小值

堆用于维护最大最小值

时间:2023-04-22 19:44:45浏览次数:19  
标签:const 一维 int 元素 leq 最小值 用于 数组 维护

前 \(k\) 小数

题目:

有两个长度为 \(n\) 的数列 \(a, b, (1\leq i, j\leq n)\) ,通过 \(a_i+b_j\) 可以构造出 \(n\times n\) 个数,求构造出的数中前 \(k\) 小的数。

格式:

输入格式:

第一行 \(2\) 个数 \(n, k\);

第二行 \(n\) 个数,表示数列 \(a\);

第三行 \(n\) 个数,表示数列 \(b\)。

其中:\(1 \leq n \leq 1e4, 1\leq k \leq n \times n \leq 1e4, 1 \leq a_i, b_j \leq 1e6\)

输出格式:

从小到大输出前 \(k\) 小的数。

样例:

输出:

3 3
2 6 6
1 4 8

输出

3 6 7

思路:

将第一行和第二行的元素按大小排序,假设用 \(n\times n\) 矩阵 \(M_{ij}\) 表示 \(a_i+b_j\) ,矩阵中,右边的元素一定比左边大,上面的元素一定比右边大,首先把矩阵的第一列元素放入最小堆里,每次询问时,取堆顶,并把堆顶元素的右边一个元素入堆,直至完成。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e8 + 7;
int m, k, a[N], b[N];

struct NODE {
    int ida, idb, num;
    bool operator>(const NODE &a) const {
        return num > a.num;
    }
} temp;
// 优先队列
priority_queue<NODE, vector<NODE>, greater<NODE>> q; 

int main() {
    cin >> m >> k;
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= m; i++) {
        cin >> b[i];
    }
    sort(a + 1, a + m + 1);
    sort(b + 1, b + m + 1);
    for (int i = 1; i <= m; i++) {
        q.push({i, 1, a[i] + b[1]});
    }
    for (int i = 1; i <= k; i++) {
        temp = q.top();
        q.pop();
        cout << temp.num << " ";
        temp.num = a[temp.ida] + b[++temp.idb];
        q.push(temp);
    }

    return 0;
}

前 \(k\) 小数(进阶)

题目:

给你 \(n\) 个长度为 \(m\) 的已知数列,你一次可以从每个数列中选出一个元素,共 \(n\) 个数,将这 \(n\) 个数的和,放入 \(a\) 数组中,穷举所有的选数可能,并且都放入 \(a\) 数组中。请你计算 \(a\) 数列中前 \(k\) 小数是多少?

格式:

输入格式:

输入 \(n, m, k\);

接下来 \(n\) 行,每一行 \(m\) 个数,空格分隔,一行表述一个数列,共 \(n\) 行。

其中:\(1\leq n\leq 200, 1\leq k\leq m\leq 200\)

输出格式:

从小到大输出前 \(k\) 小的数。

样例:

输入:

2 2 2
1 2
1 2

输出:

2 3

思路:

将二维数组中每一行的所有元素相加,并将结果保存在一个一维数组中。首先读入二维数组的大小和值,然后对于第一行的所有元素,将其加入一维数组 b 中。然后从第二行开始遍历二维数组,对于每个元素,遍历一维数组 b 中的元素,将其加上当前元素,并将结果存入一个新的一维数组 c 中。在遍历完一维数组 b 后,将一维数组 c 按照从小到大的顺序排序,并取出其中前 m 个元素,更新一维数组 b。最后,再将一维数组 b 按照从小到大的顺序排序,并输出前 k 个元素。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e8 + 7;
int n, m, k, a[N], b[N], c[N];

struct NODE {
    int ida, idb, num;
    bool operator>(const NODE &a) const {
        return num > a.num;
    }
} temp;

priority_queue<NODE, vector<NODE>, greater<NODE>> q;

int main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= m; i++) {
        cin >> b[i];
    }
    sort(a + 1, a + m + 1);
    sort(b + 1, b + m + 1);
    for (int i = 1; i <= m; i++) {
        q.push({i, 1, a[i] + b[1]});
    }
    for (int i = 1; i <= k; i++) { // c中放a和b中前k小的数
        temp = q.top();
        q.pop();
        c[i] = temp.num;
        temp.num = a[temp.ida] + b[++temp.idb];
        q.push(temp);
    }
    n -= 2;
    while (n--) {
        while (!q.empty()) { // 清空队列
            q.pop(); 
        }
        for (int i = 1; i <= k; i++) {
            a[i] = c[i];
        }
        for (int i = 1; i <= m; i++) {
            cin >> b[i];
        }
        sort(b + 1, b + m + 1);
        for (int i = 1; i <= k; i++) {
            q.push({i, 1, a[i] + b[1]});
        }
        for (int i = 1; i <= k; i++) {
            temp = q.top();
            q.pop();
            c[i] = temp.num;
            temp.num = a[temp.ida] + b[++temp.idb];
            q.push(temp);
        }
    }
    for (int i = 1; i <= k; i++) {
        cout << c[i] << " ";
    }

    return 0;
}

标签:const,一维,int,元素,leq,最小值,用于,数组,维护
From: https://www.cnblogs.com/catting123/p/17343767.html

相关文章

  • 直线模组平常是怎么维护的?
    目前,直线模组的应用非常广泛,尤其是自动化行业。使用自动化设备,可以提高工作效率,降低生产成本。如果说直线模组的使用寿命达不到预期,那么就无法达到降低生产成本的这个目的。想要直线模组的使用寿命达到预期或者是更长,我们日常要维护,当直线模组长期不用时,如果我们不细心保养,忽然使用......
  • 一个可用于生产项目 基于 .NET 6 自研ORM
    FastFramework作者Mr-zhong代码改变世界....一、前言FastFramework基于NET6.0封装的轻量级ORM框架支持多种数据库SqlServerOracleMySqlPostgreSqlSqlite优点:体积小、可动态切换不同实现类库、原生支持微软特性、流畅API、使用简单、性能高、模型数据绑定采用......
  • 如何配置一个用于深度学习的 GPU 服务器 [Ubuntu 18.04 LTS 为例]
    一、硬件配置CPUofInteli9-9980XE(18-core36-thread,@3.0-4.4GHz),RAMof128GB(DDR4),GPUofNVIDIARTX2080Ti*4(11GBGDDR6*4),andM.2NVMeSSDof1TB(/homewith256GBasswap),SATA3SSDof2TB(/ssd)andHDDof8TB*2(/dataand/proj).二......
  • C程序,用于计算整数中的位数
    以下是一个简单的C程序,用于计算整数中的位数:cCopycode#include<stdio.h>intmain(){intnum,digit=0;printf("请输入一个整数:");scanf("%d",&num);while(num!=0){digit++;num/=10;}printf("该整......
  • 字符串插值替换器,替换字符串中的插值表达式(简单实现,仅用于短文本)
    packagecom.geostar.geoonline.tools.config_write.util;importlombok.Builder;importlombok.Getter;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.regex.Pattern;/***字符串插值替换器,......
  • 2022山东省职业院校技能大赛物联网赛项(高职组)windows维护
    任务要求:netsh(NetworkShell)是一个windows系统本身提供的功能强大的网络配置命令行工具,请选手在命令提示符窗口中使用命令将netsh的配置信息导出到c:\interface.txt文件中。在服务器计算机进行配置,指定每个shell的最大内存数量为150MB。完成以上任务后请......
  • 2022全国职业院校技能大赛物联网赛项(高职组)windows维护
    任务要求:在控制台命令行窗口中,使用命令查看网络连接以及每一个网络接口设备状态,将命令和执行后的结果截图,另存为B-2-1.jpg。答: 对服务器计算机配置规则:“禁止工作站计算机访问本机任何程序或者端口,暂不启用此规则”,将配置结果界面截图另存为B-2-2.jpg。答: 在控......
  • 2022全国职业院校技能大赛物联网赛项(中职组)windows维护
    任务要求:   在服务器电脑的C盘创建IOT文件夹,赋予Everyone所有者完全控制权限,将配置截图,另存为D-4-1.jpg。答:将系统的虚拟内存设置为自动管理所有驱动器的分页文件大小的配置界面截图,另存为D-4-2.jpg。答:设置密码最长使用期限50天(非域成员),将配置界面截图,另存为D-4-3.j......
  • APP开发完成后后期维护难吗
    APP开发完成后后期维护是一个非常重要的工作,因为维护可以保持应用程序的性能和功能,提高用户体验和满意度。在应用程序开发完成后,应用程序需要持续更新和维护,以适应不断变化的用户需求和市场趋势。APP开发完成后的后期维护可能存在一些挑战,如下所述:代码的复杂性:应用程序的代码......
  • APP开发后期维护费用高吗
    APP后期维护费用的高低取决于多个因素,例如应用程序的复杂性、更新频率、维护团队的规模和地理位置等。下面是一些可能影响后期维护费用的因素:应用程序的复杂性:如果应用程序功能复杂,代码结构复杂,那么后期维护费用可能会更高。这是因为在复杂的应用程序中,发现和修复缺陷需要更多......