u_sho競プロぶろぐ

21歳。みゃーくぴとぅ。ゆる~く続けますたぶん。  デザイン変えました(2019/2/25)これでいきます

AtCoder Regular Contest 080 C - 4-adjacent

 AtCoderのC問題を埋めようと思い立ったので、頑張る。

 今回は、ABC069、ARC080のC問題「4-adjacent」。adjacentはグーグル先生によると「隣接」という意味らしい。N個の整数a[i]がもらえるので、それを並べ替えて、「隣接」するすべてのaの積(任意のiについてa[i]*a[i+1])を「4」の倍数にできるか? という問題。
 つまり、数列aを並べ替えて、奇数の隣に必ず4の倍数を持ってこれるかという問題。偶数の隣は、偶数であれば何でもよいからだ。つまり、見るべきはaの具体的な個々の数ではなく、aに含まれている4の倍数の数と奇数の個数である。ただし、奇数、4の倍数、奇数のように、両端が奇数のパターンもある(偶数が0個の場合のみ)ので、注意しようね、って感じ。

#include <iostream>
using namespace std;

int N, a;
int odd=0, even=0, multiple4=0;

int main(void){
    cin >> N;
    for(int i=0; i<N; i++){
        cin >> a;
        if(a%2) odd++;
        else if(a%4) even++;
        else multiple4++;
    }

    bool ans = true;

    if(!even){
        if(odd > multiple4+1) ans = false;
    }else{
        if(odd > multiple4) ans = false;
    }

    if(ans) cout << "Yes\n";
    else cout << "No\n";

    return 0;
}

 なにかコードについて言うとしたら、if(!even) のところかな。前にも書いたけど、C++やCでは、false値として0が設定されているので(0以外はtrue)、even の否定 !even とは、even==0 と同値です。even==0 のとき、even は偽(false)なので、!even は真(true)になります。even!=0 のときは、even は真(true)なので、!even は偽(false)になります。

 ではでは。