蓝桥杯练习题——归并排序

news2024/11/17 16:33:30

1.火柴排队

在这里插入图片描述
在这里插入图片描述

思路

1.求最小值的时候,可以直接按升序排序,这样得到的值就是最小值
2.求最小交换次数的时候,不能直接排序,因为只能交换相邻的数,只需要知道他们的相对大小,所以可以先用离散化,把火柴高度映射成 1 到 n,然后用一个中间数组 c,让 b 数组按照 a 数组的顺序归并排序,交换相邻两个元素,最多只会使得逆序对数量减一
在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10, mod = 99999997;
int a[N], b[N], c[N], d[N];
int n;

// 离散化 a 和 b 数组
void init(int q[]){
    for(int i = 1; i <= n; i++) d[i] = i;
    // d 数组根据 q 数组的大小关系排序
    sort(d + 1, d + n + 1, [&](int x, int y){
        return q[x] < q[y];
    });
    for(int i = 1; i <= n; i++) q[d[i]] = i;
}

int merge_sort(int l, int r){
    if(l >= r) return 0;
    int mid = (l + r) / 2;
    int res = (merge_sort(l, mid) + merge_sort(mid + 1, r)) % mod;
    int x = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        if(b[i] <= b[j]) d[x++] = b[i++];
        else{
            d[x++] = b[j++];
            res = (res + mid - i + 1) % mod;
        }
    }
    while(i <= mid) d[x++] = b[i++];
    while(j <= r) d[x++] = b[j++];
    for(int i = l, j = 0; j < x; i++, j++) b[i] = d[j];
    return res;
}

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    init(a), init(b);
    
    //for(int i = 1; i <= n; i ++ ) cout<<a[i]<<" ";
    //cout << "a" << endl;
    //for(int i = 1; i <= n; i ++ ) cout<<b[i]<<" ";
    //cout << "b" << endl;
    
    // c 数组做为中间数组,使得 a 数组是 "有序的",让 b 数组按照 a 数组的顺序进行归并排序
    for(int i = 1; i <= n; i++) c[a[i]] = i;
    for(int i = 1; i <= n; i++) b[i] = c[b[i]];
    
    //for(int i = 1; i <= n; i ++ ) cout<<b[i]<<" ";
    //cout << "b" << endl;
    
    // 让 b 数组按照 a 数组的顺序进行归并排序
    int res = merge_sort(1, n);
    printf("%d", res);
    return 0;
}

2.归并排序

在这里插入图片描述

思路

模板题

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n;

void merge_sort(int l, int r){
    if(l >= r) return;
    int mid = (l + r) / 2;
    merge_sort(l, mid), merge_sort(mid + 1, r);
    int x = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) b[x++] = a[i++];
        else b[x++] = a[j++];
    }
    while(i <= mid) b[x++] = a[i++];
    while(j <= r) b[x++] = a[j++];
    for(int i = l, j = 0; j < x; i++, j++) a[i] = b[j];
}

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    merge_sort(0, n - 1);
    for(int i = 0; i < n; i++) printf("%d ", a[i]);
    return 0;
}

3.逆序对的数量

在这里插入图片描述

思路

模板题

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n;
long long res;

void merge_sort(int l, int r){
    if(l >= r) return;
    int mid = (l + r) / 2;
    merge_sort(l, mid), merge_sort(mid + 1, r);
    int x = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) b[x++] = a[i++];
        else{
            res += 1ll * mid - i + 1;
            b[x++] = a[j++];
        }
    }
    while(i <= mid) b[x++] = a[i++];
    while(j <= mid) b[x++] = a[j++];
    for(int i = l, j = 0; j < x; i++, j++) a[i] = b[j];
}

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    merge_sort(0, n - 1);
    printf("%lld", res);
    return 0;
}

4.小朋友排队

在这里插入图片描述
在这里插入图片描述

思路

k 队逆序对,最少交换次数就是 k,对于每个数,k1 表示左边有多少个比它大的,k2 表示右边有多少个比它小的,所有数的 k1 和 k2 加起来 >= 2 * k,最小就是 2 * k,也就是逆序对数量的两倍,所以一共交换 1 + 2 + 3 + … + k1 + k2,那么不高兴程度之和就是每个位置的 (1 + k1 + k2) * (k1 + k2) / 2 之和

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
pair<int, int> a[N], b[N]; // 存储值和下标
long long sum[N];
int n;

void merge_sort(int l, int r){
    if(l >= r) return;
    int mid = (l + r) / 2;
    merge_sort(l, mid), merge_sort(mid + 1, r);
    int x = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        // 加上后面比 a[i] 小的数
        if(a[i].first <= a[j].first){
            sum[a[i].second] += j - mid - 1;
            b[x++] = a[i++];
        }else{
            // 加上前面比 a[j] 大的数
            sum[a[j].second] += mid - i + 1;
            b[x++] = a[j++];
        }
    }
    while(i <= mid){
        sum[a[i].second] += j - mid - 1;
        b[x++] = a[i++];
    }
    while(j <= r) b[x++] = a[j++];
    for(int i = l, j = 0; j < x; i++, j++) a[i] = b[j];
}

int main(){
    scanf("%d", &n);
    int x;
    for(int i = 0; i < n; i++){
        scanf("%d", &x);
        a[i] = make_pair(x, i);
    }
    merge_sort(0, n - 1);
    long long res = 0;
    for(int i = 0; i < n; i++) res += (1 + sum[i]) * sum[i] / 2;
    printf("%lld", res);
    return 0;
}

5.超快速排序

在这里插入图片描述
在这里插入图片描述

思路

逆序对的数量模板题

#include<iostream>
using namespace std;
const int N = 5e5 + 10;
int a[N], b[N];
int n;
long long res;

void merge_sort(int l, int r){
    if(l >= r) return;
    int mid = (l + r) / 2;
    merge_sort(l, mid), merge_sort(mid + 1, r);
    int x = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) b[x++] = a[i++];
        else{
            res += 1ll * mid - i + 1;
            b[x++] = a[j++];
        }
    }
    while(i <= mid) b[x++] = a[i++];
    while(j <= mid) b[x++] = a[j++];
    for(int i = l, j = 0; j < x; i++, j++) a[i] = b[j];
}

int main(){
    while(scanf("%d", &n) && n){
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        merge_sort(0, n - 1);
        printf("%lld\n", res);
        res = 0;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造禹州中医药大模型,以AI驱动业务创新(内附孙思邈GPT内测版)

大禹智库 第78 期&#xff08;总第409 期&#xff09; 2024年 3 月 4 日 在中医药传承与发展的关键时期&#xff0c;结合许昌市的地域特色和产业优势&#xff0c;大禹智库提出“打造禹州中医药大模型&#xff0c;以AI驱动业务创新”的战略构想。本报告围绕构建禹州中医药现代化…

七彩虹@电脑cpu频率上不去问题@控制中心性能模式cpu频率上不去@代理服务器超时@账户同步设置失败

文章目录 windows电脑cpu频率上不去新电脑的系统时间问题系统时间不准造成的具体问题举例代理超时vscode同步请求失败自动校准时间 windows电脑cpu频率上不去 问题描述,标压处理器的笔记本,cpu频率上不去 如果cpu没问题的话,就应该是系统限制了功耗导致的有的笔记本有控制中心…

10大主流压力/负载/性能测试工具推荐

在移动应用和Web服务正式发布之前&#xff0c;除了进行必要的功能测试和安全测试&#xff0c;为了保证互联网产品的服务交付质量&#xff0c;往往还需要做压力/负载/性能测试。然而很多传统企业在试水互联网的过程中&#xff0c;往往由于资源或产品迭代速度等原因忽视了这一块工…

msvcr110.dll丢失的5种修复方法,快速修复msvcr110.dll缺失问题

MSVCR110.dll文件的丢失可能会引发一系列的问题与不便&#xff0c;严重影响到用户的计算机使用体验。首先&#xff0c;由于MSVCR110.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它的缺失可能导致许多基于此运行库编译的应用程序无法正常启动或运行&a…

老阳分享:视频号带货的四大技巧

视频号带货作为新兴的电商模式&#xff0c;在微信这个庞大的社交平台上展现出了巨大的潜力。要想在视频号带货领域取得成功&#xff0c;需要掌握一定的技巧。本文将为您详细解析视频号带货的四大技巧&#xff0c;感兴趣的朋友一起去看看吧。 一、内容创新 内容创新是视频号带货…

ROS 2基础概念#6:服务(Service)| ROS 2学习笔记

服务&#xff08;Service&#xff09;是 ROS 2 计算图中节点通信的另一种方法。 服务基于调用和响应模型&#xff0c;而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获取持续更新&#xff0c;但服务仅在客户端专门调用时才提供数据。 ROS 2服务的基本概念 ROS…

5个实用的PyCharm插件

大家好&#xff0c;本文向大家推荐五个顶级插件&#xff0c;帮助开发人员提升PyCharm工作流程&#xff0c;将生产力飞升到新高度。 1.CodiumAI 安装链接&#xff1a;https://plugins.jetbrains.com/plugin/21206-codiumate--code-test-and-review-with-confidence--by-codium…

RabbitMQ架构详解

文章目录 概述架构详解核心组件虚拟主机&#xff08;Virtual Host&#xff09;RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件&#xff0c;支持多种协议和集群扩展。并且支持消息持久化和镜像队列&#xff0c;适用于对消息可靠性较高的场合 官网https://www.…

Thingsboard学习杂记

知识杂记 1.遵循磁盘绑定的内存数据库和遵循磁盘支持的内存数据库 遵循磁盘绑定的内存数据库和遵循磁盘支持的内存数据库有不同的工作方式&#xff0c;它们的优点和缺点也不同。 遵循磁盘绑定的内存数据库的优点&#xff1a; 数据库可以支持更大的数据集合&#xff0c;因为数…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号记忆承载近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

Threejs着色器(GPU)编程——感温管网

管网,作为支撑现代城市运转的重要基础设施,是隐藏在地面之下的庞大工程网络。这些管网如同城市的血脉,负责输送各种必要的资源,如水源、热力、燃气等,同时排除废水和其他废弃物。然而,由于其位于地下,人们往往难以直接感知其存在和运行状态。为了保障这些地下管网的安全…

王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29

第 4 章 字符串 本章介绍一种基础数据类型——字符串&#xff0c;并且介绍一些字符串处理的方法及字符串匹配的方法。虽然字符串的内容非常基础&#xff0c;但是十分重要。希望读者能够好好学习本章的内容&#xff0c;为此后的学习打下良好的基础。 4.1 字符串内容详解 由于 …

3月求职黄金期!如何打造自己的岗位优势?这6大分析维度很重要!

三月份&#xff0c;又到了一年的求职黄金期。在今年这场求职大队中&#xff0c;想要找到一份满意的工作&#xff0c;你不仅要学会打造一份高质量简历&#xff0c;还要懂得完美应对HR的各项提问。 一、岗位能力的6大分析维度 虽说是求职黄金期&#xff0c;但找工作也不是随便找…

一键查看:大厂网站都用了啥技术栈,有图有真相。

本次我们采用Wappalyzer插件来看下国内大厂的网站都采用了什么技术架构&#xff0c;文章最后由Wappalyzer的安装方法。 今日头条网站 淘宝网站 哔哩哔哩 京东商城 花瓣网 CSDN 国务院 网易 58同城 腾讯网 如何安装Wappalyzer 用Edge浏览器即可

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

Spring Boot中SQL语句报错

报错原因&#xff1a; You have an error in your SQL syntax 你的SQL语句出现错误 报错位置&#xff1a; check the manual that corresponds to your MySQL server version for the right syntax to use near :/sql/schema.sql.t_film at line 1 在:/sql/schema.sql附近使用…

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…

md5绕过

文章目录 \\和\\\md5数组绕过科学计数法绕过双md加密md5碰撞Hash长度攻击 下面会以同一道题给大家演示&#xff1a; (题目来源与nssctf) 和 在php代码中我们会看到和&#xff0c;虽然两个都是表示相等&#xff0c;但是在细节上会有所部区别 &#xff1a;是弱比较&#xff0c;只…

Java基础面试题(day 01)

&#x1f4d1;前言 本文主要是【Java】——Java基础面试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …