C.C
题意:
一列数,每个数有方向,向左或者向右,初始方向都是向右。可以选择相邻的两个数交换位置,两个数的方向要取反。
问,是否可以将数列交换成非递减数列,并且每个数的方向都向右?
题解:
推断可以发现,奇数位与奇数位的数字通过一定方法交换是不会改变方向的,即奇数位数可以随意调换,偶数位数可以随意调换,于是我们可以将奇数位的数放在一个数组里,把偶数位数放在一个数组里,然后对他们进行排序,然后奇数位偶数位奇数位偶数位这样交叉存入一个数组,看这个数组是否可以成非递减数列,如果可以,“YES”
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],ji[N],ou[N];
int main()
{
int t;
cin>>t;
L:while(t--)
{
int n;
cin>>n;
int j=0,o=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(i%2)
{
ji[j]=x;
j++;
}
else
{
ou[o]=x;
o++;
}
}
sort(ji,ji+j);
sort(ou,ou+o);
//for(int i=0;i<j;i++)
// cout<<ji[i]<<' ';
//for(int i=0;i<o;i++)
//cout<<ou[i]<<' ';
j=0,o=0;
for(int i=0;i<n;i++)
{
if(i%2)
{
a[i]=ou[o];
o++;
}
else
{
a[i]=ji[j];
j++;
}
}
for(int i=0;i<n-1;i++)
{
if(a[i]>a[i+1])
{
cout<<"NO"<<endl;
goto L;
}
}
cout<<"YES"<<endl;
}
return 0;
}