题解 CF2034B

· · 题解

题意:

给定一个 0-1 串,可以把连续 k 个元素推平成 1,问最少推平多少次可以使串中没有连续 m0

思路:

错误做法:考虑把每个 0 区间分开处理;实际上连续的 k 个元素推平是可以跨区间的,所以必须整体考虑。

考虑贪心的思想,直接从左往右推,当发现有连续 m 个元素后直接从当前位置起,向后推平 k 个位置。这样做我们每一步都一定是最优的,正确。

程序如下:

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=2e5+5;
int T,n,m,k;
char str[N];
int main(){
    scanf("%d",&T);
    while(T--){
        memset(str,0,sizeof(str));
        scanf("%d%d%d%s",&n,&m,&k,str+1);
        int curcnt=0,ans=0;//维护curcnt作为当前连续0个数
        for(int i=1;i<=n;i++){
            if(str[i]=='1')curcnt=0;
            else{
                curcnt++;
                if(curcnt==m){
                    ans++;
                    i=i+k-1;
                    curcnt=0;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

THE END