【基础算法】小白鼠排队问题

60 阅读3分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是小白鼠排队问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述


AcWing 3425. 小白鼠排队题解

题目描述

nn只小白鼠,它们的体重分别为m1,m2,,mnm_1,m_2,\cdots,m_n。现在要将它们排成一列。

每次可以交换相邻两只小白鼠(保证不越界),这样操作一次称为一步。问最少需要几步才能使得从左到右的小白鼠的体重是非降序列。

输入格式

第一行一个整数nn

接下来nn个正整数表示m1,m2,,mnm_1,m_2,\cdots,m_n

输出格式

输出一个整数,表示最少操作次数。

数据范围

1n10000,1mi1091≤n≤10000,1≤m_i≤10^9

样例

输入

6
3 5 4 8 6 7

输出

2

题解

本题属于模拟排序问题,一种常见的思路是通过归并排序的方式求出逆序数,然后再通过对输入数组进行排序来得到答案。

但是这里介绍一种更简洁明了的方法,也就是直接使用C++自带的sort函数来排序。排序过程中统计交换次数即可。

算法流程

  1. 读取输入数据。
  2. 使用sort函数对小白鼠体重进行排序。
  3. 在排序过程中统计交换次数,输出结果。

时间复杂度

sort函数的时间复杂度为O(nlogn)O(n\log n)

空间复杂度

本算法空间复杂度为O(n)O(n)

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;
}

时间复杂度:O(nlogn)O(n\log n)

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!