[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; }
结束啦!谢谢大家!

浙公网安备 33010602011771号