🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏
@TOC
前言
今天我们继续学习算法,加油。这篇文章写的是小白鼠排队问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。
AcWing 3425. 小白鼠排队题解
题目描述
有只小白鼠,它们的体重分别为。现在要将它们排成一列。
每次可以交换相邻两只小白鼠(保证不越界),这样操作一次称为一步。问最少需要几步才能使得从左到右的小白鼠的体重是非降序列。
输入格式
第一行一个整数。
接下来个正整数表示。
输出格式
输出一个整数,表示最少操作次数。
数据范围
样例
输入
6
3 5 4 8 6 7
输出
2
题解
本题属于模拟排序问题,一种常见的思路是通过归并排序的方式求出逆序数,然后再通过对输入数组进行排序来得到答案。
但是这里介绍一种更简洁明了的方法,也就是直接使用C++自带的sort函数来排序。排序过程中统计交换次数即可。
算法流程
- 读取输入数据。
- 使用sort函数对小白鼠体重进行排序。
- 在排序过程中统计交换次数,输出结果。
时间复杂度
sort函数的时间复杂度为。
空间复杂度
本算法空间复杂度为。
C++代码
#include<iostream>
#include<algorithm>
using namespace std;
int n, ans;
const int N = 10010;
int a[N], b[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
// 复制一份未经排序的数组
copy(a+1, a+n+1, b+1);
sort(a+1, a+n+1);
// 统计交换次数
for(int i = 1; i <= n; i++)
if(a[i] != b[i]) ans++;
cout << ans << endl;
return 0;
}
时间复杂度:。
最后
十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
1.把时间尺度拉长,拉长十年看当下
2.不说负面情绪,只描述事实;
3.越专注于过好自己,能量和幸运越会照顾你;
只解决问题,不做没有意义的担心,输了就认;
4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了
5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。
最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!