题目
本题要求在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;
}
第一篇题解!完结撒花!!!