蓝桥杯练习题——归并排序
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;
}
相关文章:
蓝桥杯练习题——归并排序
1.火柴排队 思路 1.求最小值的时候,可以直接按升序排序,这样得到的值就是最小值 2.求最小交换次数的时候,不能直接排序,因为只能交换相邻的数,只需要知道他们的相对大小,所以可以先用离散化,把…...
C语言--- 指针运算笔试题详解
目录 题目1: 题目2: 题目3: 题目4: 题目5: 题目6: 题目7: 题目1: #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);print…...
甘特图是什么,怎么制作?一文让你看懂
甘特图是什么 甘特图是一种项目管理工具,通过图形化的方式直观的能体现出任务、进度和资源在时间里的关系。 白话文就是: 项目分解成了哪些任务?每天计划做什么任务?当前每个任务的进度是多少?项目整体进度是多少?这个项目有…...
mysql笔记:6. 存储引擎
文章目录 查看引擎信息常用引擎介绍InnoDBMyISAMMEMORY存储引擎的选择 数据库存储引擎是数据库底层组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等,使用不同的存储引擎&#…...
(golang)切片何时会创建新切片或影响原切片
什么时候切片操作会影响原切片 // 1.切片后没有触发slice的扩容机制时 什么时候对切片操作会创建新切片不影响原切片 // 2.对切片头元素进行截取的时候 // 3.当使用append时,len > cap则会触发扩容机制 前置: //slice结构体 type SliceHeader struct…...
前端面试——W3C标准及规范
W3C标准 1、万维网联盟标准不是某一个标准,而是一些列标准的集合。 简单来说可以分为结构、表现和行为 结构 主要是有HTML标签组成 表现 即指css样式表 行为 主要是有js、dom组成 web标准一般是将该三部分独立分开,使其更具有模块化。但一般产生行为时&…...
读算法的陷阱:超级平台、算法垄断与场景欺骗笔记07_价格歧视
1. 行为歧视 1.1. 单个企业通过使用数据驱动的算法,从而更好地实现锁定客户、开展个性化营销与定价的目的 1.2. 市场环境再次发生了变化 1.2.1. 在共谋场景中,定价算法提高了企业经营者在销量数据上的透明性…...
数据结构 之 链表LinkedList
目录 1. ArrayList的缺陷: 2. 链表: 2.1 链表的概念及结构: 3. 链表的使用和模拟实现: 3.1 构造方法: 3.2 模拟实现: 4. 源码分享: 在我学习顺序表之后,我就立马开始了链表的学…...
事务【MySQL】
事务的概念 引入 在 A 转账 100 元给 B 的过程中,如果在 A 的账户已经减去了 100 元,B 的账户还未加上 100 元之前断网,那么这 100 元将会凭空消失。对于转账这件事,转出和转入这两件事应该是绑定在一起的,任意一个动…...
Anaconda 的一些配置
Anaconda 安装及修改环境默认位置 https://blog.csdn.net/qq_54562136/article/details/128932352 最重要的一步!!!!!改文件夹权限 Anaconda创建、激活、退出、删除虚拟环境 修改pip install 默认安装路径...
利用Nginx正向代理实现局域网电脑访问外网
引言 在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的。这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx 转发访问外网的需求…...
SpringMVC03、HelloSpring
3、HelloSpring 3.1、配置版 新建一个Moudle , springmvc-02-hello , 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version"1.0" encoding"UTF-8…...
IOS面试题object-c 1-10
1、简述Object-C的理解与特性? OC 作为一门 面向对象 的语言,自然具有面向对象的语言特性:封装、继承、多态。 它既具有 静态语言的特性(如C),又有 动态语言的效率(动态绑定、动态加载等&#…...
原生JavaScript,根据后端返回扁平JSON动态【动态列头、动态数据】生成表格数据
前期准备: JQ下载地址: https://jquery.com/ <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JSON动态生成表格数据,动态列头拼接</title><style>table {width: 800px;text-align: cen…...
hadoop报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法
参考:https://blog.csdn.net/weixin_45735242/article/details/120579387 解决方法 1.下载apache-hadoop-3.1.0-winutils-master 官网下载地址: https://github.com/s911415/apache-hadoop-3.1.0-winutils win配置系统环境: 然后重启idea…...
基于Springboot的高校物品捐赠管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的高校物品捐赠管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…...
【硬件工程师面经整理29_FPGA】
文章目录 1 nand nor的区别,速度差异的原因?2 nand驱动方式?3 异步信号处理方法4 异步FIFO的深度是如何计算的5 异步复位同步释放的优缺点6 问了FPGA的内部组成?7 LE中查找表的实现原理?8 IOB的主要组成部分࿱…...
Ping工作原理
文章目录 目的ping网络协议 OSIICMP什么是ICMP作用功能报文类型查询报文类型差错报文类型ICMP 在 IPv4 和 IPv6 的封装ICMP 在 IPv4 协议中的封装ICMP 在 IPv6 协议中的封装ICMP 头部日常ping 排除步骤ping 查询报文使用code扩展目的 本文主要是梳理ping的工作原理- 揭开 ICMP…...
python调用jar中java方法 静态类为例
java package test;public class test {// run方法返回当前脚本路径public static String runV1(String s) {return "log: " System.getProperty(s);}}python import jpype from jpype import * import osif __name__ "__main__":print(os.environ[JAV…...
tcp服务器客户端通信(socket编程)
目录 1.编程流程 2.代码演示 2.1 服务器代码 2.2 客户端代码 3.注意 3.1 ping命令 3.2 netstat命令 3.3 为什么memset? 3.4 哪个会阻塞? 3.5 显示连接信息 1.概念 1.1 编程流程 1.2 connect与listen connect方法执行后,会进行三次握手,建立连…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
