2025/12/11 cf2176problem B题解

25 阅读1分钟

Problem - B - Codeforces

题目

本题要求在O(n)内移动字符串覆盖原字符串中的所有0,求出最小步数和。

首先考虑字符串中最长0组,答案即为最长0组的长度。

证明

假设ans<len(max0),我们每次选择d=1移动,所以每次移动后各0组最左边的0变为1,移动ans次后,因为ans<len(max0)所以最长0组中一定还存在0,与题意不符。

AC代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n,cnt=0,ans=0;
	cin>>n;
	string s;
	cin>>s;
	s+=s;//注意考虑首尾都为0的情况
	n*=2;
	for(int i=0;i<n;i++){
		if(s[i]=='1')cnt=0;
		else cnt++;//找最长0组
		ans=max(ans,cnt);
	}
	cout<<ans<<endl;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t=1;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

第一篇题解!完结撒花!!!