虽然放在最后一题,但是还是比较水的,只需要判断奇偶性问题就可以了。
题目
你有四种字母,每种字母有一定的数量
可以进行有限次操作
每次把l,o,v三种字母分别删除一个(显然三种字母都需要大于等于1),然后你获得3个字母e
问经过若干次(可能是零次)操作后是否能把所有字母排列成回文串?
输入描述
第一行一个t表示t组询问
接下来t行,每行四个数字,分别表示字母l,o,v,e的字母数量
输出描述
t行,如果可以输出YES,不可以输出NO
示例输入
2
2 3 4 5
2 0 0 1
示例输出
NO
YES
数据范围
t<=10^5
每种字母数量小于等于10^9
根据回文串的性质,可得四种字母的个数应存在三个及以上的偶数(中间的字母奇偶均可),如下:
lovevol
loveevol
根据题意,可每次将l,o,v三个字母删除一个并添加3个字母e,即每操作一次改变四个字母的奇偶性一次。可得操作奇数次则改变奇偶性,偶数次则不变。
由于每个字母的个数不能小于0,因此操作的最大次数为l,o,v中的最小值,此时仅需考虑剩下三种(甚至更少)字母的奇偶性是否满足构成回文串的条件。
代码:
#include <iostream>
using namespace std;
int l,o,v,e;
int main(){
int t,min=0;
cin>>t;
int l1,o1,v1,e1;
for(int i=0;i<t;i++){
cin>>l>>o>>v>>e;
if(l>o)
min=o;
else
min=l;
if(min>v)
min=v;
if(min>0){
l1=l%2,o1=o%2,v1=v%2,e1=e%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else{
l-=min;
o-=min;
v-=min;
e1+=min%2;
if(e1==2)
e1=0;
l1=l%2,o1=o%2,v1=v%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else
printf("NO\n");
}
}
else{
l1=l%2,o1=o%2,v1=v%2,e1=e%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}