火柴排队(逆序对 + 离散化)

505. 火柴排队

原题链接
在这里插入图片描述

思路

如下是画图分析的一些过程
在这里插入图片描述
在这里贪心的思路是排序,然后两个数组都是从小到大那样对应的话最终的答案可达到最小
而我们只能交换相邻的火柴,故在这里先假设一个简化版本,即A有序,而只需要对B进行操作,可发现,其实就是再在求逆序对数量在这里插入图片描述
有了简化版本思路,我们再对原数组进行处理,这里想到将其转化为简化版,也就是将原数组映射为排好序的1,2,3,…这样的数组,然后相应的也映射到B数组,随后就可以进行操作了
要注意的一点,数据过大,故先将a[], b[]数组进行离散化

离散化的话一般是从下标1开始的,故题目中最好也用下标从1开始

代码如下

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, MOD = 99999997;
int n, a[N], b[N], c[N], p[N];  //这里的p数组可理解为临时数组,用来当作容器为其他数组服务
//c[]数组为映射数组void work(int a[]) {for(int i = 1; i <= n; i++) p[i] = a[i];sort(p + 1, p + n + 1);for(int i = 1; i <= n; i++) a[i] = lower_bound(p + 1, p + n + 1, a[i]) - p;
}int merge_sort(int l, int r) {if(l >= r)  return 0;int mid = l + r >> 1;//这里的分治区间别忘了累加resint res = (merge_sort(l, mid) + merge_sort(mid + 1, r) ) % MOD;int i = l, j = mid + 1, k = 0;while(i <= mid && j <= r) {if(b[i] <= b[j])    p[k++] = b[i++];else {p[k++] = b[j++];res = (res + mid - i + 1) % MOD;}}while(i <= mid) p[k++] = b[i++];while(j <= r) p[k++] = b[j++];for(int i = l, j = 0; i <= r; i++, j++) b[i] = p[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]);//首先,数据太大,进行数据的离散化(也是为了后期的映射对位)work(a), work(b);//然后,进行映射,将A数组映射为一个排好序的数组,B数组根据A数组数据也对应位置for(int i = 1; i <= n; i++) c[a[i]] = i;//对B的操作,在映射数组C[]中找b[i]的映射数据for(int i = 1; i <= n; i++) b[i] = c[b[i]];//最后,进行求最少交换次数(逆序对数量)int ans = merge_sort(1, n) % MOD;cout << ans;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构五】队列和Queue详解

目录 队列 1.模拟实现一个队列 2.Queue的基本使用 3.循环队列详解 4.双端队列详解 5.分别用栈实现队列&#xff0c;队列实现栈 队列 队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(Fi…

ruoyi-vue框架密码加密传输

先看一下改造后的样子&#xff0c;输入的密码不会再以明文展示。 下面我主要把前后端改造的代码贴出来。 1.后端代码 RsaUtils类 在com.ruoyi.common.utils包下新建RsaUtils类&#xff0c;RsaUtils添加了Component注解 generateKeyPair()构建密钥对添加了Bean注解 在项目启动…

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

Ansible 基础入门

2&#xff09;Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具&#xff0c;基于 Paramiko 开发的&#xff0c;并且基于模块化工作&#xff0c;Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台&#xff0c;它是基于 Python 语言&#xf…

19-Java中介者模式 ( Mediator Pattern )

Java中介者模式 摘要实现范例 中介者模式&#xff08;Mediator Pattern&#xff09;提供了一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支持松耦合&#xff0c;使代码易于维护中介者模式是用来降低多个对象和类之间的通信复杂性中介者模式属于行为型模式…

内衣洗衣机怎么选?2024年度最新爆品内衣洗衣机测评

内衣裤洗衣机是一种非常实用的洗衣机&#xff0c;可以有效地保护内衣和贴身衣物的质量和卫生&#xff0c;相比于普通的家用大型洗衣机&#xff0c;内衣裤洗衣机在容量、洗涤方式、控制方式和价格等方面有很大的不同之处&#xff0c;如果您经常需要清洗内衣和贴身衣物&#xff0…

Python实战小项目-骰子模拟器+Turtle绘图

Python实战小项目-骰子模拟器Turtle绘图 骰子模拟器Turtle绘图 骰子模拟器 导入了random模块&#xff0c;该模块提供了生成随机数的功能。 定义了两个变量min_val和max_val&#xff0c;分别表示骰子的最小值和最大值。在这个例子中&#xff0c;骰子的最小值为1&#xff0c;最大…

SpringMVC 中的常用注解和用法

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 注解 1. MVC定义2. 注解2.1 RequestMappin…

【python基础学习11课_异常机制】

一、异常 1、异常的定义 异常&#xff1a;程序无法继续执行异常会中断程序执行异常处理&#xff0c;是为了不中断程序执行。而不是避免错误。有些代码是报错就是要暴露出来有了异常机制&#xff0c;错误的代码报错后抛出异常&#xff0c;代码从上到下&#xff0c;报错代码后面…

AI嵌入式CanMV-K230项目(1)-简介

文章目录 前言一、嘉楠的产品体系二、开发板介绍三、应用领域总结 前言 前一些列文章我们介绍了K210的使用方法&#xff0c;近期嘉楠科技发布了最新一版的K230芯片&#xff0c;下面我们来了解下这款芯片&#xff0c;后续我们将介绍该款芯片开发板的使用方法。 一、嘉楠的产品体…

javascript操作BOM的方法

目录 1.window.alert() 2.window.confirm() 3.window.prompt() 4.window.location() 5.window.navigator() 6.window.screen() 7.window.history() 8.window.setTimeout() 和 window.clearTimeout() 9.window.setInterval() 和 window.clearInterval() BOM&#xff08…

基于51单片机的万年历-心率脉搏计仿真及源程序-保存心率记录

基于51单片机的万年历-心率脉搏计仿真及源程序-保存心率记录 一、系统方案 1、本设计采用51单片机作为主控器。 2、液晶1602显示。 3、DS1302万年历&#xff0c;测心率&#xff0c;按键设置万年历、心率上下限&#xff0c;不在范围蜂鸣器报警。 4、心率测量值保存3组数据。 二、…