AtCoder Regular Contest 080C: 4-adjacent 题解

思维题
首先所有的数可以分成能被4整除的,能被2整除但不能被4整除的和没有2因子的三类
显然如果没有最后一类的话是显然可以的,所以我们只要考虑是否每个最后一类的数都能保证其左右都是第一类数
如果没有第二类数,那么只要第一类数个数大于等于第三类个数减一就行,因为最极端的可以出现31313这样的例子
如果有第二类数,那么就得保证第一类树个数大于等于第三类数个数

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const LB eps=1e-10;
const LB pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

int n;
int a[100048];
int cnt1,cnt2,cnt4;

int main ()
{
    int i;
    n=getint();
    for (i=1;i<=n;i++) a[i]=getint();
    for (i=1;i<=n;i++)
    {
        if (a[i]%4==0) {cnt4++;continue;}
        if (a[i]%2==0) {cnt2++;continue;}
        cnt1++;
    }
    if (cnt2==0)
    {
        if (cnt4>=cnt1-1) cout<<"Yes"<<endl; else cout<<"No"<<endl;
        return 0;
    }
    if (cnt4>=cnt1) cout<<"Yes"<<endl; else cout<<"No"<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/iceprincess_1968/article/details/80397169
今日推荐