HDU 6020 MG loves apple

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6020

 

 题意:

解题思路:

实现代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN=1000005;
int a[MAXN];
char s[MAXN];

void calc(int &a3,int &E1,int &E2,int N){
    a3=0,E1=0,E2=0;
    //a3:=第一个mod3=0且非0的数前0的个数
    for(int i=1;i<=N;i++){
        if(a[i]==0)
            a3++;
        if(a[i]==3)
            break;
    }

    //E1:是第一个0前是否存在mod3=1的数
    //E2:是第一个0前是否存在mod3=2的数
    for(int i=1;i<=N;i++){
        if(a[i]==0)
            break;
        if(a[i]==1)
            E1=1;
        if(a[i]==2)
            E2=1;
}
}


int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N,K;
        scanf("%d%d",&N,&K);
        scanf("%s",s+1);

        int s0=0,s1=0,s2=0;
        for(int i=1;i<=N;i++){
             a[i]=s[i]-'0';
             if(a[i]%3==1) a[i]=1,s1++;
             else if(a[i]%3==2) a[i]=2,s2++;
             else s0++,a[i]=a[i]?3:0;
        }
        int ans=(s1+s2*2)%3;
        int a3,E1,E2,f=0;
        calc(a3,E1,E2,N);

        for(int C=0;C<=s2&&C<=K;C++){
            int B=((ans-C*2)%3+3)%3;
            for(;B<=s1&&B+C<=K;B+=3){
                int A=K-B-C;

                if(A<=s0){
                    if(A>=a3) f=1;
                    else if(B<s1&&E1)f=1;
                    else if(C<s2&&E2) f=1;
                }

                if(f) break;
            }
            if(f)
                break;
        }

       if((N==K+1)&&s0) f=1;
       if(f) puts("yes");
       else puts("no");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IKnowYou0/p/6670300.html