1 条题解
-
2
题目意思
给你一个数组,并给出他们的入队顺序,求最少要进行几次交换位置,才能完成从小到大排序的要求。
解题思路
模拟入队的顺序,每一次都排一下序。因为每次最新入队的都是在最后面,所以就从后到前遍历,遇到比他大的就交换一下。
但是前面的都是相同的怎么办?
那我们再设一个变量,从要交换的元素开始,如果他的前一个与他相同,那就指向前一个,直到前一个不同或到达第一个为止。再把这个变量指向的值与最新的值交换。
如果最新的值前面的都比他小或相等,直接退出该循环。
参考代码:
#include<bits/stdc++.h> using namespace std; int a[2010],b[2010]; int main() { int n,m; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; cin>>m; for(int i=1;i<=m;i++) { int x,s=0; cin>>x; b[i]=a[x];//更新最后的值 for(int j=i-1;j>=1;j--) if(b[j]>b[j+1]) { int x=j; while(x>1&&b[x-1]==b[x])x--;//如果与前一个相等,则指向前一个 swap(b[x],b[j+1]);//交换 j=x;//j也要指向最新值 s++;//计数器+1 } else break;//退出该循环 cout<<s<<endl; } return 0; }
- 1
信息
- ID
- 659
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 49
- 已通过
- 22
- 上传者