题目描述
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
输入格式
共两行。
第一行是车厢总数 N(N≤10000)
第二行是 N个不同的数表示初始的车厢顺序。
输出格式
一个整数,最少的旋转次数。
样例 1
样例输入 1
4
4 3 2 1
样例输出 1
6
解题思路:看到这个题目,我立刻就想到了冒泡排序,于是便想到了用冒泡来做,结果就AC了。
首先,啥是冒泡排序呢。(这是我自己的理解,如有问题请斧正)其实这是一种排序算法,它的原理如下:(排序目标:数据从左到右为从小到大。)首先,我们假设有这么一串数据:8 9 4 5 1,我们先从数据的第一位开始。数据的第1位是8,我们将其与后一位进行比较,也就是9(规则是这样的,若后一位比前一位数小,则二者位置交换之),9比8大,因此二者不交换。然后我们继续下一步,将数据的第二位与第三位比较,1比9小,二者交换,此时数据便成了8 4 9 5 1 ,接着我们继续下一步,将数据的第三位与第四位比较,5比9小,二者换位,此时数据变成8 4 5 9 1.再接着我们将数据的第四位与第五位进行比较,1比9小,二者交换,数据变为8 4 5 1 9.细心的你一定会发现,此时最大的一位数已经排到了最右边。那么,既然我的目标已经完成,我们最右边的这个数就可以不管了,下一次我们只需要进行到将数据的第三位与第四位比较就可以了,也就是说,每次循环遍历的数据数会比上一次循环少1。为什么会这样呢?聪明的你一定发现了,每次循环就会把遍历到的最大数放到右边,以此类推,第二次循环结束后第二大的数8会放在右往左第二位,第三次循环结束后第三大的数5会放在右往左第三位......因此,每次循环到的最后一位就是上一次循环的最后一位往前推一位。由于这种方法使数据向泡泡一样,大的往上飘,小的往下飘,便叫冒泡排序。让我们回到题目,要通过桥将车厢从小到大排序,而桥的功能是使相邻两个车厢调换位置。这很像什么?不就是冒泡排序嘛!因此要解这道题,只需要写一个冒泡排序,再设定一个初始值为0的变量,在每次交换的时候加一,最后输出该变量即是正解。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[100086], n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = n; i > 1; i--) {
for (int j = 1; j <= i - 1; j++) {
if (a[j] > a[j + 1]) {
swap(a[j], a[j + 1]);
ans++;
}
}
}
cout << ans;
return 0;
}