CF1681C Double Sort 题解

这是蒟蒻我第一次写题解,球球管理员通过吧。


题目传送门

这道题目的意思就是给我们两个数组 a a a b b b,然后进行排序。但是两个数组下标相同的数字(即 a i a_i ai a j a_j aj 交换时 b i b_i bi b j b_j bj 也要交换)要同时交换。问题是是否经过若干次排序之后两个数组都是非递减顺序。

思路:

  1. 首先我们发现 n n n 的最大值仅有 100 100 100,所以可以考虑使用冒泡排序。
  2. 接着我们先备份这两个数组(后面用),然后排序原来的数组,并用一个变量 a n s ans ans 来记录一共交换了多少次。
  3. 排序完原来的数组后我们判断两个数组是否都是非递减顺序,如果不是,证明不行,则输出 − 1 -1 1;如果是,输出 a n s ans ans,然后用我们备份的数组再进行一次冒泡排序,交换时输出 i i i j j j 即可。

代码:

#include
using namespace std;
int a[105],b[105],aa[105],bb[105];
int t,n;
int main()
{
	cin>>t;
	while(t--)
	{
		int ans=0;
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>a[i],aa[i]=a[i];//备份a数组
		for(int i=1;i<=n;i++)
			cin>>b[i],bb[i]=b[i];//备份b数组
		for(int i=1;i<n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				if(a[j]<a[i]||b[j]<b[i])
				{
					swap(a[j],a[i]),swap(b[j],b[i]);
					ans++;//冒泡排序,同时记录交换次数
				}
			}
		}
		bool f=0;
		for(int i=1;i<n;i++)
		{
			if(a[i]>a[i+1]||b[i]>b[i+1])
			{
				f=1;
				break;
			}//判断是否为非递减数列
		}
		if(f)
		{
			cout<<-1<<endl;
			continue;
		}
		cout<<ans<<endl;
		if(!ans)continue;
		for(int i=1;i<n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				if(aa[i]>aa[j]||bb[i]>bb[j])
				{
					swap(aa[i],aa[j]);
					swap(bb[i],bb[j]);
					cout<<i<<" "<<j<<endl;
				}//再来一次冒泡,并输出过程
			}
		}
	}
	return 0;
}

完美撒花~

你可能感兴趣的:(算法,数据结构,c++)