13.搬砖

目录

题目

Description

Input

Output

思路(归并排序)

具体步骤如下

C++整体代码(含详细注释)

归并排序总结

核心步骤

代码模板


题目

Description

小张在暑假时间来到工地搬砖挣钱。包工头交给他一项艰巨的任务,将一排砖头按照从低到高的顺序排好。可是小张的力量有限,每次只能交换相邻的两块砖头,请问他最少交换几次能够完成任务?

Input

第一行一个整数

n(1 \leq n \leq 300000 )

,表示砖头数量。
第二行

n

个整数

a_i(-1000000000 \leq a_i \leq 1000000000 )

,表示砖头的高度。

Output

一个整数,表示最少交换几次能够完成任务。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 5↵
  2. 4 1 3 2 5↵
以文本方式显示
  1. 4↵
1秒64M0


思路(归并排序)

冒泡排序的时间复杂度是O(n^2),归并排序的时间复杂度是O(nlogn);
本题使用冒泡排序TLE(超时),因此考虑归并排序。
 

归并排序的思路是将数组划分为越来越小的子数组,然后不断将子数组合并成有序的数组。在合并的过程中,统计交换次数,即每次将右半区的元素插入到左半区时,左半区剩余的元素个数(即逆序数)为交换次数

通过归并排序的思路,可以保证最终的数组是有序的,并且交换次数是最少的。


具体步骤如下

1.首先,定义了一个merge函数,用于将两个有序的子数组合并成一个有序的数组。在合并的过程中,记录交换次数count,用来统计交换的次数。

//归并两个有序数组 
void merge(vector<long long>& h, int left, int mid, int right, long long& count) {vector<long long> tempArr(right - left + 1);//分配一个临时数组int l_pos = left;int r_pos = mid + 1;int pos = 0;while (l_pos <= mid && r_pos <= right) {if (h[l_pos] <= h[r_pos]) {//左半区第一个剩余元素更小tempArr[pos++] = h[l_pos++];}else {//右半区第一个剩余元素更小tempArr[pos++] = h[r_pos++];count += mid - l_pos + 1; // 更新交换次数}}//合并左半区剩余元素while (l_pos <= mid)tempArr[pos++] = h[l_pos++];//合并右半区剩余元素while (r_pos <= right)tempArr[pos++] = h[r_pos++];//把临时数组中合并后的元素复制回原来的数组for (int i = 0; i < pos; i++) {h[left + i] = tempArr[i];}
}

2.然后,定义了一个mergeSort函数,用于对数组进行归并排序。在归并排序的过程中,将数组不断划分为两个子数组,然后分别对子数组进行递归排序,最后再将两个有序的子数组合并成一个有序的数组。

//归并排序
void mergeSort(vector<long long>& h, int left, int right, long long& count) {if (left >= right) {//如果左区间大于右区间或者只有一个元素时,就不需要继续划分//如果只有一个元素,本生就是有序的,只需要被归并即可return;}//找中间点int mid = (left + right) / 2;//递归划分左半区mergeSort(h, left, mid, count);//递归划分右半区mergeSort(h, mid + 1, right, count);//合并已经排序的部分merge(h, left, mid, right, count);
}

3.在主函数中,首先读取输入的砖头数量n和砖头的高度数组h。然后定义一个变量count来记录交换次数。接着调用mergeSort函数对数组h进行归并排序,并将交换次数保存在count中。

最后,输出count,即为完成任务所需的最少交换次数。

int main() {int n;cin >> n;vector<long long> h(n);for (int i = 0; i < n; i++) {cin >> h[i];}long long count = 0;mergeSort(h, 0, h.size() - 1, count);cout << count << endl;return 0;
}

C++整体代码(含详细注释)

#include <iostream>
#include <algorithm>
#include <vector> using namespace std;//归并两个有序数组 
void merge(vector<long long>& h, int left, int mid, int right, long long& count) {vector<long long> tempArr(right - left + 1);//分配一个临时数组int l_pos = left;int r_pos = mid + 1;int pos = 0;while (l_pos <= mid && r_pos <= right) {if (h[l_pos] <= h[r_pos]) {//左半区第一个剩余元素更小tempArr[pos++] = h[l_pos++];}else {//右半区第一个剩余元素更小tempArr[pos++] = h[r_pos++];count += mid - l_pos + 1; // 更新交换次数}}//合并左半区剩余元素while (l_pos <= mid)tempArr[pos++] = h[l_pos++];//合并右半区剩余元素while (r_pos <= right)tempArr[pos++] = h[r_pos++];//把临时数组中合并后的元素复制回原来的数组for (int i = 0; i < pos; i++) {h[left + i] = tempArr[i];}
}//归并排序
void mergeSort(vector<long long>& h, int left, int right, long long& count) {if (left >= right) {//如果左区间大于右区间或者只有一个元素时,就不需要继续划分//如果只有一个元素,本生就是有序的,只需要被归并即可return;}//找中间点int mid = (left + right) / 2;//递归划分左半区mergeSort(h, left, mid, count);//递归划分右半区mergeSort(h, mid + 1, right, count);//合并已经排序的部分merge(h, left, mid, right, count);
}int main() {int n;cin >> n;vector<long long> h(n);for (int i = 0; i < n; i++) {cin >> h[i];}long long count = 0;mergeSort(h, 0, h.size() - 1, count);cout << count << endl;return 0;
}

归并排序总结

归并排序的核心是将一个未排序的数组逐步划分为越来越小的子数组,然后将这些子数组合并成一个有序的数组。

核心步骤

  1. 分割:将未排序的数组划分为两个子数组,分别对左右两个子数组进行递归地分割,直到每个子数组只包含一个元素或为空。

  2. 合并:将两个有序的子数组合并成一个有序的数组。在合并的过程中,比较左右两个子数组的元素,将较小(或较大)的元素放入临时数组中,直到其中一个子数组的元素全部放入临时数组中。然后将剩余的另一个子数组的元素依次放入临时数组中。

  3. 复制:将临时数组中的元素复制回原来的数组。

通过不断地递归分割和合并,最终可以得到一个完全有序的数组。

归并排序的核心思想是分治法,将一个大问题拆分为若干个小问题,然后分别解决这些小问题,最后将解决好的小问题合并成一个整体解决方案。在归并排序中,每次合并两个有序的子数组时,都能保证合并后的数组仍然是有序的,通过不断地合并,最终可以得到一个完全有序的数组。

代码模板

#include <iostream>
#include <vector>using namespace std;// 合并两个有序的子数组
void merge(vector<int>& nums, int left, int mid, int right) {int n1 = mid - left + 1; // 左子数组的长度int n2 = right - mid; // 右子数组的长度// 创建临时数组来存储合并后的结果vector<int> temp(n1 + n2);int i = left; // 左子数组的起始索引int j = mid + 1; // 右子数组的起始索引int k = 0; // 临时数组的索引// 将两个子数组中的元素按照从小到大的顺序放入临时数组中while (i <= mid && j <= right) {if (nums[i] <= nums[j]) {temp[k++] = nums[i++];} else {temp[k++] = nums[j++];}}// 将左子数组中剩余的元素放入临时数组中while (i <= mid) {temp[k++] = nums[i++];}// 将右子数组中剩余的元素放入临时数组中while (j <= right) {temp[k++] = nums[j++];}// 将临时数组中的元素复制回原数组for (int p = 0; p < n1 + n2; p++) {nums[left + p] = temp[p];}
}// 归并排序
void mergeSort(vector<int>& nums, int left, int right) {if (left >= right) {return;}int mid = left + (right - left) / 2; // 找到数组的中间位置// 递归地对左右两个子数组进行归并排序mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);// 合并两个有序的子数组merge(nums, left, mid, right);
}int main() {int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}mergeSort(nums, 0, n - 1);// 输出排序后的数组for (int i = 0; i < n; i++) {cout << nums[i] << " ";}cout << endl;return 0;
}

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

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

相关文章

Royal TSX 6 Mac多协议远程软件

Royal TSX是一款功能强大的远程桌面管理软件&#xff0c;适用于Mac操作系统。它允许用户通过一个集成的界面来管理和访问多个远程计算机和服务器。 Royal TSX支持多种远程协议&#xff0c;包括RDP、VNC、SSH、Telnet和FTP等&#xff0c;可以方便地连接到Windows、Linux、Mac和其…

非煤矿山风险监测预警算法 yolov8

非煤矿山风险监测预警算法通过yolov8网络模型深度学习算法框架&#xff0c;非煤矿山风险监测预警算法在煤矿关键地点安装摄像机等设备利用智能化视频识别技术&#xff0c;能够实时分析人员出入井口的情况&#xff0c;人数变化并检测作业状态。YOLO的结构非常简单&#xff0c;就…

ios开发 swift5 苹果系统自带的图标 SF Symbols

文章目录 1.官网app的下载和使用2.使用代码 1.官网app的下载和使用 苹果官网网址&#xff1a;SF Symbols 通过上面的网址可以下载dmg, 安装到自己的mac上 貌似下面这样不能展示出动画&#xff0c;还是要使用动画的代码 .bounce.up.byLayer2.使用代码 UIKit UIImage(system…

解决报错Java: 非法字符: ‘\ufeff‘

方法一&#xff1a;直接remove BOM&#xff0c;再重新启动程序。 方法二&#xff1a;用notpad打开&#xff0c;点击编码为utf-8格式&#xff0c;保存。

GrapeCity Documents V6.0 Update 2发布,新增支持SpreadJS的.sjs文件格式

近日&#xff0c;GrapeCity Documents 正式迎来其V6.2 的发布更新&#xff0c;能够支持 SpreadJS 中 .sjs 类型的文件。这一重大更新将为用户带来更多地惊喜。 .sjs文件有两个关键优势&#xff1a;空间更小且导入导出速度更快。通过采用 .sjs格式&#xff0c;GcExcel实现了更高…

PO设计模式是selenium自动化测试中最佳的设计模式之一

Page Object Model&#xff1a;PO设计模式是selenium自动化测试中最佳的设计模式之一&#xff0c;主要体现在对界面交互细节的封装&#xff0c;也就是在实际测试中只关注业务流程就OK了传统的设计中&#xff0c;在新增测试用例之后&#xff0c;代码会有以下几个问题&#xff1a…

maven部署

一、下载Maven 地址&#xff1a;Maven – Download Apache Maven 二、解压缩&#xff0c;设置环境变量 tar -xvf apache-maven-3.8.8-bin.tar.gz export MAVEN_HOME/opt/apache-maven-3.8.8 export PATH$MAVEN_HOME/bin:$PATH echo $MAVEN_HOME echo $PATH mvn -v

Stable Diffusion Web UI的原理与使用

Stable Diffusion是一套基于Diffusion扩散模型生成技术的图片生成方案&#xff0c;随着技术的不断发展以及工业界对这套工程细节的不断优化&#xff0c;使其终于能在个人电脑上运行&#xff0c;本文将从github下载开始讲一讲如何使用Stable Diffusion Web UI进行AI图像的生成。…

水稻叶病害数据集(目标检测,yolo使用)

1.数据集文件夹 train文件夹&#xff08;44229张&#xff09;&#xff0c;test文件夹&#xff08;4741张&#xff09;&#xff0c;valid文件夹&#xff08;6000张&#xff09; 2.train文件夹展示 labels展示 标签txt展示 data.yaml文件展示 对数据集感兴趣的可以关注最后一行…

网络安全法+网络安全等级保护

网络安全法 2014年2月&#xff0c;中央网络安全和信息化领导小组成立&#xff0c;习主席当组长 2017年6月1日&#xff0c;网络安全法正式成立 网络安全是国家安全的重要组成部分没有网络安全就没有国家安全&#xff0c;没有信息化就没有现代化 网络安全法21条 网络安全法31条 …

[C/C++]天天酷跑游戏超详细教程-上篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

视频剪辑音效处理软件有哪些?视频剪辑软件那个好用

音效是视频剪辑的重要部分&#xff0c;能起到画龙点睛的作用。在短视频平台中&#xff0c;一段出彩的音效能将原本平平无奇的视频变得生动有趣。那么&#xff0c;视频剪辑音效处理软件有哪些&#xff1f;本文会给大家介绍好用的音效处理软件&#xff0c;同时也会介绍视频剪辑音…

危险的套娃:攻击者在 PDF 文件中隐藏恶意Word 文档

据BleepingComputer消息&#xff0c;日本计算机紧急响应小组 (JPCERT) 日前分享了在2023 年 7 月检测到的利用PDF文档的新型攻击——PDF MalDoc攻击&#xff0c;能将恶意 Word 文件嵌入 PDF 来绕过安全检测。 JPCERT采样了一种多格式文件&#xff0c;能被大多数扫描引擎和工具识…

如何使用CSS实现一个带有动画效果的进度条?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML 结构&#xff1a;⭐ CSS 样式&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中&#xff0c;词向量&#xff08;…

运维Shell脚本小试牛刀(一)

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 一: Shell中循环剖析 for 循环....... #!/bin/bash - # # # # FILE: countloop.sh # USAGE: ./countloop.sh # DESCRIPTION: # OPTIONS: ------- # …

c++ boost::json

Boost社区12月11日发布了1.75版本&#xff0c;在之前&#xff0c;​​Boost使用Boost.PropertyTree解析​​JSON​​​&#xff0c;​​XML​​​&#xff0c;​​INI​​​和​​INFO​​​格式的文件。但是由于成文较早及需要兼容其他的数据格式&#xff0c;相比较于其他的​…

秒懂算法2

视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…

arm版Linux下安装es集群

背景&#xff1a;由于生产上网络没通&#xff0c;没办法&#xff0c;只能自己安装一个es集群的测试环境了&#xff0c;我的电脑是Mac M2&#xff0c;安装的Linux是centos7&#xff0c;也是arm版的。 第一步&#xff1a;查看自己Linux系统的版本 命令&#xff1a;uname -a 例如…

设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页

默认情况下&#xff0c;Microsoft Edge会向您显示世界上最令人分心和讨厌的主页&#xff08;也称为主屏幕&#xff09;。微软不想只向你展示一个搜索框&#xff0c;也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式&#xff0c;而是想在你面前扔一堆新闻标题和广告。 你可…