洛谷刷题笔记5.p1116 车厢重组

题目描述

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值