【题解】【洛谷P1116】【冒泡排序】——车厢重组

车厢重组

戳我查看题目(洛谷)

题目描述

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180 180 180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

输入格式

共两行。

第一行是车厢总数 N ( ≤ 10000 ) N( \le 10000) N(10000)

第二行是 N N N 个不同的数表示初始的车厢顺序。
:实际上数据中并不都在同一行,有可能分行输入)

输出格式

一个整数,最少的旋转次数。

输入输出样例

输入 #1

4
4 3 2 1

输出 #1

6

1.题意解析

    这道题可以把每节车厢都抽象成一个数字。再根据“相邻两节车厢的位置交换”,“从小到大排列”,我们就可以把这道题抽象成一道冒泡排序题了。唯一不同的是,我们需要输出的是交换次数。这里我们用一个变量ans来存储。

    想了解冒泡排序的可以去看看这篇文章冒泡排序讲解和优化以及(附C++代码实现)。里面详细讲解了冒泡排序和它的几种优化方式。

2.AC代码

#include<bits/stdc++.h>
using namespace std;
int ans;
//注意:这里最多使用到第二次优化
void Bubble_sort(int a[],int n)
{
	bool flag=0;//假设没有发生交换
	int pos=n-1;//假定当前最后一次发生交换的位置是n-1,即数组全部无序 
    for(int i=1;i<=n-1;i++)//n个数排序,只用进行n-1趟
    {
    	int second_pos=pos;//暂时存储上一个pos 
	    for(int j=1;j<=second_pos;j++)
	        if(a[j]>a[j+1])//比较大小并交换
	        {
	            swap(a[j],a[j+1]);
	            ans++; 
	            pos=j;//更新位置 
	            flag=1;//发生了交换
	        }
        if(!flag)break;//没有发生交换,跳出
	 }
}
int main()
{
    int a[100010],n;
    cin>>n;
    for(int i=1;i<=n;i++)
         cin>>a[i];
	Bubble_sort(a,n);
	cout<<ans;
    return 0;
}

还有一种更简洁的代码,无优化,也能过。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,c[10010],ans=0;//用ans记录交换次数 
    cin>>n;
    for(int i=1;i<=n;i++)cin>>c[i];
    for(int i=1;i<=n-1;i++)//相当于冒泡排序 
    	for(int j=1;j<=n-i;j++)
    		if(c[j]>c[j+1])
    		{
			    swap(c[j],c[j+1]);
			    ans++;
			}
	cout<<ans;
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值