CodeForces1360C - Similar Pairs - 思维+暴力
题意
给出T组数据,每组数据给出一个n,接下去给出一个长度为n的数组。(n是偶数)
我们现在需要将数组中的元素分为两个一组,
问所有的分组中每个元素是否满足:差值为1 或 奇偶性一样
全部分组都满足则输出YES,否则输出NO
思路
情况一 特判:
奇数和偶数的个数一样 且 个数都为偶数。如果奇数的个数ji为偶数,因为n是偶数,所以说明偶数的个数ou也为偶数,这种情况直接输出YES
情况二:
奇数和偶数的个数不一样。如果奇数的个数ji为奇数,同理,偶数的个数ou也必为奇数。所以我们只需要对所有元素进行排序,判断是否存在差值为1的元素对即可。注意后面输出NO的条件是 if(ji&1&&!flag)
,而不是 if(!flag)
,不要搞错了。
AC代码
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int a[55];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int ji=0,ou=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]&1) ji++;//x[cnt1++]=ji;
else ou++;//y[cnt2++]=ou;
}
// sort(x,x+cnt1),sort(y,y+cnt2);
//ji&1==0间接相当于ou&1==0,因为n是偶数
if(ji&1==0)
cout<<"YES"<<endl;
else
{
// 如果奇数个数为奇数
// 那么偶数个数也必为奇数
sort(a,a+n);
bool flag=0;
for(int i=1;i<n;i++)
{
if(a[i]-a[i-1]==1)
{
flag=1;
break;
}
}
// if(flag)
// cout<<"YES"<<endl;
if(ji&1&&!flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
return 0;
}