CodeForces1360C

题意

给出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;
}
原文地址:https://www.cnblogs.com/OFSHK/p/14733101.html