问:给出一个数组,求是否能够使所有的数都可以“类似”匹配。
”类似“:两个数具有相同的奇偶性,或差的绝对值为1。
思路:我们求出奇数的个数x,偶数的个数y,相邻元素的对数z。
如果x是偶数,y是偶数,那对于每个元素都可以找到一个匹配。
如果x是奇数,y是奇数,那只要z>0,就可以用一个奇数一个偶数凑成一对。剩下的就成了上面的情况了。
如果x,y是一奇一偶,那就一定不能凑成对。因为要用到z的话x,y都会消耗,x,y始终都是一奇一偶,回到刚开始的问题。
#include<bits/stdc++.h>
using namespace std;
int s[110];
int main() {
int t, n, x, u, v, flag;
cin >> t;
while(t--) {
memset(s, 0, sizeof s);
u = 0, v = 0, flag = 0;
cin >> n;
for(int i=0; i<n; i++) {
scanf("%d", &x);
s[x] = 1;//用个数组记录是否
if(s[x-1] || s[x+1]) flag = 1;//判断有无相邻成对
if(x % 2) u++;//奇数
else v++;//偶数
}
if(!(u%2) && !(v%2)) printf("Yes\n");//假设1
else if(u%2 && v%2){//假设2
if(flag) printf("Yes\n");
else printf("No\n");
}
else printf("No\n");//假设3
}
return 0;
}