AcWing 505. 火柴排队(每日一题)

news2024/12/23 14:02:43

目录

题目链接:505. 火柴排队 - AcWing题库

解题思路:

离散化:

归并排序求逆序对:

总代码:


题目链接:505. 火柴排队 - AcWing题库

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。

现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。 

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。

请问得到这个最小的距离,最少需要交换多少次?

如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

输入格式

共三行,第一行包含一个整数 n,表示每盒中火柴的数目。 

第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。

第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出格式

输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

数据范围

1≤n≤10^5,
0≤火柴高度≤2^31−1,

输入样例:

4
2 3 1 4
3 2 1 4

输出样例:

1

解题思路:

离散化+归并排序求逆序对(或者树状数组求逆序对)

树状数组比较抽象,这里以归并排序为例。先听我阐述一下大体思路,后面细节听我娓娓道来。这个题一看无非是交换序列最小次数,如果我们固定第一组数据,那么第二组数据就按照第一组的数据大小排列即可保证最小距离,那么我们把第一组数据排一下序,第二组的数据是不是就好处理了。由于数据量很大,且数据不集中很离散,可能会爆栈,考虑离散化。那么我们把数组a,b都处理好了下面考虑移动几次就好了。根据结论,一个数组b中的元素移动到另一个数组a使其位置相同,最少需要移动b的逆序对数(前提是排好序),那么我们如何求逆序对呢,想一想归并排序的实现,可以利用前面数组l的数l[i]大于后面数组r的数r[j]的特点,若前面数组l的数l[i]大于后面数组r的数r[j],说明数组l此时位置i往后到mid的位置都是逆序对数,因为数组l是有序的,既然此时的位置i都要大于数组r的数r[j],那么l[i]到l[mid]都是大于r[j]的,那么逆序对数就是mid-i+1,总的逆序对数即为答案。


离散化:

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;

什么时候使用离散化,当数据很离散且很大,当要去此值当作数组下标,例如n<=1e5;0<=a[i]<=1e9。

下面写一个模板

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
const int M=1e9+5;
int a[N];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);//排序
	int len=unique(a+1,a+n+1)-(a+1);//去重,len为新长度
	for(int i=1;i<=len;i++){
		cout<<a[i]<<" ";//排序好的数据
		a[i]=lower_bound(a+1,a+n+1,a[i])-a;
		cout<<a[i]<<endl;//离散化映射下标
	}
	return 0;
}


归并排序求逆序对:

下面写一下求逆序对函数:

int merge_sort(int l,int r){
    if(l>=r)return 0;
    int mid=l+r>>1;
    int 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;
}
总代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=99999997;
const int N=1e5+5;
int n;
int a[N],b[N],c[N],p[N];
int find(int x){//二分查找
    int l=1,r=n;
    while(l<r){
        int mid=l+r>>1;
        if(p[mid]>=x)r=mid;
        else l=mid+1;
    }
    return l;
}
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]=find(a[i]);
       //a[i]=lower_bound(p+1,p+n+1,a[i])-p;可以用lower_bound函数更简单
	}
    return;
}
int merge_sort(int l,int r){//归并求逆序对
    if(l>=r)return 0;
    int mid=l+r>>1;
    int 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(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    work(a),work(b);
    for(int i=1;i<=n;i++)c[a[i]]=i;
    for(int i=1;i<=n;i++)b[i]=c[b[i]];
    cout<<merge_sort(1,n)<<endl;
    return 0;
}

此题比较抽象,需要很多转化处理,可以看一看B站的讲解,笔者写可能有不准确的地方,一些地方也不是最优解法,望大家理解,若有错误请大家指出共同进步。

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

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

相关文章

牛客小白月赛88

E.多重映射 解题思路 对集合进行整体操作&#xff0c;集合大小只增不减&#xff0c;问最后集合标号维护集合&#xff0c;考虑并查集但直接用并差集维护会有以下问题&#xff1a;当前集合变标号&#xff0c;可能会和之前标号相同&#xff0c;则进行并查集操作时&#xff0c;会接…

在Linux(Ubuntu)中使用终端编译 vscode安装

文章目录 &#x1f4da;在Linux&#xff08;Ubuntu&#xff09;中使用终端编译&#x1f407;.cpp程序编译&#x1f407;.py程序编译&#x1f407;查看Python、C编程环境 &#x1f4da;vscode安装 &#x1f4da;在Linux&#xff08;Ubuntu&#xff09;中使用终端编译 虚拟机安装…

VR全景技术在VR看房中有哪些应用,能带来哪些好处

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在房地产行业中的应用也越来越广泛。其中&#xff0c;VR全景技术在VR看房中的运用尤为突出。今天&#xff0c;让我们一起深入探讨VR全景技术在VR看房中的应用及其带来的种种好处。 一、…

博特激光——激光打标机工作原理介绍

激光打标机&#xff0c;作为现代标识技术的杰出代表&#xff0c;其工作原理的高效与精确性使得它在众多行业中占据了举足轻重的地位。今天&#xff0c;我们将深入探讨激光打标机的工作原理及其背后的科技魅力。 激光打标机的工作原理主要基于激光的高能量和聚焦特性。首先&…

Python实现归并排序算法

Python实现归并排序算法 以下是 Python 中的归并排序算法实现示例&#xff1a; def merge_sort(arr):if len(arr) > 1:mid len(arr) // 2 # 计算中间索引left_half arr[:mid] # 划分左半部分right_half arr[mid:] # 划分右半部分# 递归调用对左右两半进行排序me…

SpringBoot整合Redis实现分布式锁

SpringBoot整合Redis实现分布式锁 分布式系统为什么要使用分布式锁&#xff1f; 首先&#xff0c;分布式系统是由多个独立节点组成的&#xff0c;这些节点可能运行在不同的物理或虚拟机器上&#xff0c;它们通过网络进行通信和协作。在这样的环境中&#xff0c;多个节点可能同…

前端实现单点登录

简单概括就是&#xff0c;一个系统登录&#xff0c;跳转多个系统&#xff0c;其他系统不需要再登录&#xff0c;直接进入页面 登录的系统 <template><div><div class"content"><div class"item" v-for"(item,index) in list&q…

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇&#xff0c;新建assets文章夹&#xff0c;将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候&#xff0c;将添加打开本地网页的代码&#xff1a; //打…

【HTML】HTML基础8.1(表单标签)

目录 效果 基础知识 标签 ① ② 代码 效果 基础知识 表单的组成元素 表单控件用户所填写的信息提示信息提示用户需要填的信息表单域包含表单元素的区域 标签 ① <form action"" method""></form> <form>标签确定了一个表单域&…

【Linux】第四十站:线程概念

文章目录 一、线程二、Linux中线程应该如何理解三、重新定义线程四、四谈进程地址空间&#xff08;页表相关&#xff09;五、Linux线程周边的概念1. 线程与进程切换2.线程优点3.线程缺点4.线程异常5.线程用途 一、线程 线程&#xff1a;是进程内的一个执行分支。线程的执行粒度…

阿里云DSW做AI绘画时的显卡选择A10?V100?

V100是Volta架构&#xff0c;A10是Ampere架构&#xff0c;架构上讲A10先进点&#xff0c;其实只是制程区别&#xff0c;用起来没区别。 V100是HBM的内存读取&#xff0c;带宽大&#xff0c;但是DDR5的。 二块卡都是全精度为主的算力卡&#xff0c;半精度优势不明显。 需要用…

Spring学习 基础(二)Bean和AOP

3、Spring Bean Bean 代指的就是那些被 IoC 容器所管理的对象&#xff0c;我们需要告诉 IoC 容器帮助我们管理哪些对象&#xff0c;这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 Bean的创建方式 1. XML 配置文件&#xff1a; 传统上&am…

Learn OpenGL 02 你好,三角形

图形渲染管线 图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分 首先&#xff0c;我们以数组的形式传递3个3D坐标作为图形渲染管线的输入&#xff0c;用来表示一个三角形&#xff0c;这个数组叫做顶点数据(Vertex Data)。 顶点着色…

最新2024年阿里云服务器地域和可用区全球分布表,不只是中国

2024年最新阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

superset连接Apache Spark SQL(hive)过程中的各种报错解决

superset连接数据库官方文档&#xff1a;Installing Database Drivers | Superset 我们用的是Apache Spark SQL&#xff0c;所以首先需要安装下pyhive #命令既下载了pyhive也下载了它所依赖的其他安装包 pip install pyhive#多个命令也可下载 pip install sasl pip install th…

设计模式-结构型模式-代理模式

代理模式&#xff08;Proxy&#xff09;&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。[DP] // 定义接口 interface Subject {void request(); }// 真实主题对象 class RealSubject implements Subject {Overridepublic void request() {System.out.println(&quo…

App自动化测试笔记(十一):综合案例

短信案例 需求 在《短信》应用中&#xff0c;进入发送短信页面&#xff0c;在姓名和内容栏中&#xff0c;输入对应的数据&#xff0c;并点击发送。 包名界面名&#xff1a;com.android.mms/.ui.ConversationList 发送短信页面标识&#xff1a;resource-id&#xff0c;com.and…

乐得瑞 1C to 2C快充线:引领充电数据线新潮流,高效快充解决接口难题

随着科技的不断进步&#xff0c;数据线的接口种类也日渐繁多&#xff0c;但在早些时候&#xff0c;三合一和二合一的数据线因其独特的设计而备受欢迎。这类数据线通常采用USB-A口作为输入端&#xff0c;并集成了Micro USB、Lightning以及USB-C三种接口&#xff0c;满足了当时市…

【二】【算法分析与设计】编程练习

数字三角形 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 KiKi学习了循环&#xff0c;BoBo…

2024年AI辅助研发趋势深度分析

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在各个行业领域中的应用也日益广泛。特别是在研发领域&#xff0c;AI已经成为变革的先锋&#xff0c;极大地推动了科技进步的步伐。本文将从技术进展、行业应用案例、面临的挑战与机遇、未来趋势预测、法规…