链接:登录—专业IT笔试面试备考平台_牛客网
题目描述
给定一个数组。每次可以交换数组中两个奇数或者两个偶数,可以交换无数次。问最后是否能把数组变成非降序数组?
用数学语言来说,对于数组aaa,每次可以交换 aia_iai 和 aja_jaj ,当且仅当i≠ji≠ji=j 且 (ai−aj) mod 2=0(a_i-a_j)\ mod\ 2=0(ai−aj) mod 2=0。问经过一些操作后,最终是否能使得数组满足:对于 i∈[1,n)i∈[1,n)i∈[1,n),ai≤ai+1a_i\leq a_{i+1}ai≤ai+1?
输入描述:
第一行输入一个正整数 nnn ,代表数组的长度。 第二行输入 nnn 个正整数 aia_iai ,代表拿到的数组。 1≤n,ai≤1001\leq n ,a_i \leq 1001≤n,ai≤100
输出描述:
如果最终能使数组变成非降序,则输出"Yes"。否则输出"No"。
示例1
输入
5 3 2 1 4 5
输出
Yes
示例2
输入
5 1 3 2 2 5
输出
No
简单的奇偶排序。把下标存入一个数组,排序后再用数组下标中的信息插回去就行了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define fast std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read()
{
int x=0,k=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*k;
}
const int maxn=1e6+10;
int n,m,k,tot,num[maxn],cnt[maxn];
vector<int>a[2],b[2];
signed main(){
fast
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>k;a[k&1].push_back(k);
b[k&1].push_back(i);
}
sort(a[0].begin(),a[0].end());
sort(a[1].begin(),a[1].end());
int cnt=0;
for(int i=0;i<a[0].size();i++){
num[b[0][i]]=a[0][i];
}
for(int i=0;i<a[1].size();i++){
num[b[1][i]]=a[1][i];
}
for(int i=1;i<n;i++){
if(num[i]>num[i+1])
{
cout<<"No\n";
return 0;
}
}
cout<<"Yes\n";
}