专栏文章

题解 CF2034B

CF2034B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqw0r4b
此快照首次捕获于
2025/12/04 11:39
3 个月前
此快照最后确认于
2025/12/04 11:39
3 个月前
查看原文

题意:

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

思路:

错误做法:考虑把每个 00 区间分开处理;实际上连续的 kk 个元素推平是可以跨区间的,所以必须整体考虑。
考虑贪心的思想,直接从左往右推,当发现有连续 mm 个元素后直接从当前位置起,向后推平 kk 个位置。这样做我们每一步都一定是最优的,正确。

程序如下:

CPP
#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

评论

0 条评论,欢迎与作者交流。

正在加载评论...