[Luogu]P1116 车厢重组 题解

这道题啊很难,像我这种蒟蒻直接在洛谷在线IDE中敲了一遍就过了

这道题目属于排序一类,适合算法初学者练习,同类的题目有[P2094](普及/提高-,对于初学者或许有点难)等.

咳咳,言归正传...

我们要养成先读题的好习惯,就像是我们做数学题一样,至少要读3遍题,看懂了本质再想思路写代码;通过题面-----

"桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序",

"按车厢号从小到大排列"

可以知道是两个数字之间进行排序,回忆一下之前的算法,我第一个想到的就是冒泡排序,核心算法语句在下面

 

for (int i=1;i<=n-1;i++)
    for (int j=1;j<=n-i;j++)
         if (a[j]<a[j+1])//从小到大排列,若从大到小的话用'>'
          {
          temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;//核心的交换代码
            }        

大家可能看过许多的题解代码,dalao们喜欢在if()语句后面加{ 而不是回车后加{ ;咱带侠真的不建议大家这样做,代码不仅仅是一个个字符,一行行语句,ta更是一种艺术,如果把代码写得美观大方,自己看的都很舒服,这样在以后debug的时候自己会更爱看,如果把代码写得太乱,一遍过还好,如果出了问题,自己debug的时候估计会看烦吧....

咳咳咳,言归正传,在最后一句中"计算最少用多少步就能将车厢排序" 说明并不是单纯的套冒泡代码,在后面需要再计算到底有几次才行,因此我们引入count这个(int)整形变量,计数变量再定义时最好加上'=0',要不然最后输出的时候恐怕会出乱子...

最后放代码啦!

#include<cstdio> 
#include<bits/stdc++.h> 
using namespace std;
int main()
{
    int a[10001],n,count=0,temp;
    cin>>n;
    for(int k=1;k<=n;k++)    
        cin>>a[k];
    for (int i=1;i<=n-1;i++)
        for (int j=1;j<=n-i;j++)
             if (a[j]>a[j+1])
            {
            temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
            count++;
            }
    cout<<count;
    return 0;
}

 

结束啦!谢谢大家!

 

posted @ 2020-10-16 21:49  BugHero_Zhang  阅读(302)  评论(0)    收藏  举报