题解CF53D

update 2022.8.6:发现有错误,改一下。

题目传送门(CF53D)

这一题,有两个数组,分别是  a,b\ a,b

然后我们看一下 nn 的数据范围,1n3001\leq n\leq300

于是考虑  O(n3)\ \operatorname{O}(n^3)


思路部分

首先,这一题是要求换数组  b\ b 直到换成数组  a\ a

题目是这么写的——

不需要最小化移动次数。

那么,我们可以利用冒泡排序的性质,去得到答案。

冒泡排序的思路是:

比较  ai \ a_i\  ai1\ a_{i-1},(升序排列)如果  ai>ai1\ a_i>a_{i-1},交换  ai \ a_i\  ai1\ a_{i-1}

第一轮比较结束之后,最大的数就到最后面的  an \ a_n\ 了。

经过  n1 \ n-1\ 轮比较,数组就有序了。

我们对冒泡进行改动,即可  AC \ \text{AC}\ 本题。

当我们把一个数移到另一个位置时,ansans 数组就记录下来了。

记录下来之后,因为本题不求最优解,所以一点问题没有。

而且冒泡只交换连续的两个数字,所以不会违反题意。

代码实现

读入部分就不说了。

如果, ai=bj\ a_i=b_j,说明找到了人,开始交换。

交换的过程用第三层循环  k \ k\ 来表示。

k,i<kj\forall k,i<k \leq j

记得  k \ k\ 是倒序循环。

然后定义  ans \ ans\ 数组,记录答案(记录  k \ k\ )。当然了,记录  k1 \ k-1\ 的话最后输出时就得输出  ansi \ ans_i\  ansi+1\ ans_i+1

最后,对于每个  ansi\ ans_i,输出  ansi1 \ ans_i-1\  ansi \ ans_i\ 即可。

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;
}

时间复杂度约为  O(n3)\ \operatorname{O}(n^3)

后记:萌新第一次写题解,如果有错,请大佬帮忙指出!谢谢啦!

posted @   Weslie_qwq  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示