LOVE(江西師範大学ニューウィンドカップ2021春新入生プログラムデザインコンペティション)

オリジナルタイトルリンク

それは最後の質問に置かれていますが、それでも比較的水っぽいです。パリティの問題を判断するだけで済みます。

トピック

4種類の文字があり、それぞれに特定の番号があります。
限られた数の操作を実行できます
。l、o、vの3文字を一度に1つずつ削除します(明らかに、3文字すべてがまたはより大きくなければなりません) 1)に等しい場合、3文字を取得します。e。
数回(おそらくゼロ)の操作の後、すべての文字をパリンドロームに配置できますか?

説明を入力してください

最初の行のtは、tグループクエリを意味します

次のt行では、各行に4つの数字があり、文字l、o、v、eの数を示しています。

出力の説明

t行、YESを出力できる場合、NOを出力することはできません

サンプル入力

2
2 3 4 5
2 0 0 1

サンプル出力

いいえ
はい

データ範囲

t <= 10 ^ 5
各文字数が10 ^ 9以下

回文の性質に応じて、次のように、4文字の数に3つ以上の偶数が必要です(中央の文字は偶数または偶数にすることができます)。

lovevol
loveevol

質問の意味に応じて、l、o、vの3文字を一度に1つずつ削除し、eを3文字追加します。つまり、操作ごとに4文字のパリティを1回変更します。奇数の演算はパリティを変更でき、偶数の演算は変更されません。

各文字の数は0未満にすることはできないため、操作の最大数はl、o、およびvの最小値です。現時点では、残りの3つ(またはそれ以下)のパリティを考慮する必要があるだけです。文字は回文を形成する要件を満たしています文字列の状態。

コード:

#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;
}

おすすめ

転載: blog.csdn.net/laysan/article/details/114932220