题解CF53D
update 2022.8.6:发现有错误,改一下。
题目传送门(CF53D)
这一题,有两个数组,分别是 。
然后我们看一下 的数据范围,。
于是考虑 。
思路部分
首先,这一题是要求换数组 直到换成数组 。
题目是这么写的——
不需要最小化移动次数。
那么,我们可以利用冒泡排序的性质,去得到答案。
冒泡排序的思路是:
比较 和 ,(升序排列)如果 ,交换 和 。
第一轮比较结束之后,最大的数就到最后面的 了。
经过 轮比较,数组就有序了。
我们对冒泡进行改动,即可 本题。
当我们把一个数移到另一个位置时, 数组就记录下来了。
记录下来之后,因为本题不求最优解,所以一点问题没有。
而且冒泡只交换连续的两个数字,所以不会违反题意。
代码实现
读入部分就不说了。
如果,,说明找到了人,开始交换。
交换的过程用第三层循环 来表示。
。
记得 是倒序循环。
然后定义 数组,记录答案(记录 )。当然了,记录 的话最后输出时就得输出 和 。
最后,对于每个 ,输出 和 即可。
AC Code:
#include<iostream>
using namespace std;
int a[301],b[301],ans[1000001],p,n;//定义数组和变量(不会MLE)
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(b[j]==a[i]){
for(int k=j;k>i;k--){
swap(b[k],b[k-1]);//冒泡排序思路交换
ans[++p]=k;//记录ans
}
break;//一定记得break
}
}
}
cout<<p<<endl;//输出总数
for(int i=1;i<=p;i++){
cout<<ans[i]-1<<' '<<ans[i]<<endl;
}
return 0;
}
时间复杂度约为 。
后记:萌新第一次写题解,如果有错,请大佬帮忙指出!谢谢啦!

浙公网安备 33010602011771号