返回顶部

Codeforces Round #666 (Div. 2) C. Multiples of Length (贪心)

  • 题意:给你一个由\(0,1,?\)组成的字符串,你可以将\(?\)任意改成\(0\)\(1\),问你操作后能否使得该字符串的任意长度为\(k\)的区间中的\(0\)和$1的个数相等.

  • 题解:我们首先看前\(k\)个字符,那么对于区间\([2,k+1]\),如果要满足条件,\(s_{k+1}=s_{1}\)一定要成立,由此我们可以推导出,\(s_{i\ mod\ k}=s_{i}\),然后模拟就可以了,具体看代码.

  • 代码:

    int t;
    int n,k;
    char s[N];
    int cnt1,cnt2;
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	t=read();
    	while(t--){
    		n=read();
    		k=read();
    		cnt1=0;
    		cnt2=0;
    		scanf("%s",s);
     
    		bool flag=true;
    		for(int i=k;i<n;++i){
    			if(s[i]==s[i%k] || s[i]=='?') continue;
    			if(s[i%k]=='?') s[i%k]=s[i];
    			else{
    				flag=false;
    				break;
    			}
    		}
    		for(int i=0;i<k;++i){
    			if(s[i]=='0') cnt1++;
    			if(s[i]=='1') cnt2++;
    		}
    		if(cnt1>k/2 || cnt2>k/2) flag=false;
    		if(flag) puts("YES");
    		else puts("NO");
    	}
     
        return 0;
    }
    
posted @ 2020-09-12 18:18  _Kolibri  阅读(157)  评论(0)    收藏  举报