专栏文章
题解 CF2034B
CF2034B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqw0r4b
- 此快照首次捕获于
- 2025/12/04 11:39 3 个月前
- 此快照最后确认于
- 2025/12/04 11:39 3 个月前
题意:
给定一个 0-1 串,可以把连续 个元素推平成 ,问最少推平多少次可以使串中没有连续 个 。
思路:
错误做法:考虑把每个 区间分开处理;实际上连续的 个元素推平是可以跨区间的,所以必须整体考虑。
考虑贪心的思想,直接从左往右推,当发现有连续 个元素后直接从当前位置起,向后推平 个位置。这样做我们每一步都一定是最优的,正确。
程序如下:
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 条评论,欢迎与作者交流。
正在加载评论...