传送门: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; }