LOVE(江西师大新风杯2021春季新生程序设计竞赛)

原题链接

虽然放在最后一题,但是还是比较水的,只需要判断奇偶性问题就可以了。

题目

你有四种字母,每种字母有一定的数量
可以进行有限次操作
每次把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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值