这是蒟蒻我第一次写题解,球球管理员通过吧。
题目传送门
这道题目的意思就是给我们两个数组 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 也要交换)要同时交换。问题是是否经过若干次排序之后两个数组都是非递减顺序。
思路:
- 首先我们发现 n n n 的最大值仅有 100 100 100,所以可以考虑使用冒泡排序。
- 接着我们先备份这两个数组(后面用),然后排序原来的数组,并用一个变量 a n s ans ans 来记录一共交换了多少次。
- 排序完原来的数组后我们判断两个数组是否都是非递减顺序,如果不是,证明不行,则输出 − 1 -1 −1;如果是,输出 a n s ans ans,然后用我们备份的数组再进行一次冒泡排序,交换时输出 i i i 和 j j j 即可。
代码:
#include<iostream>
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;
}
完美撒花~