作者:
Liyb
,
2022-08-06 20:51:51
,
所有人可见
,
阅读 6
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N],m;
int n;
//将每两头牛看成是一个区间,我们只需要在每个区间内合法的放牛即可
bool check(int x)//判断在x的间距下能放多少头牛
{
//判断能否放一头牛的标准是:这头牛与前后两头牛的间距都要大于等于x
//我们放牛的区间为[1,n],但还要同时表示出前一头牛,当前要放的牛,后一头牛
//所以我们的p从1-x开始即可
int p = 1 - x,cnt = 0;
for(int i = 1;i <= m; i ++)
{
//判断是否与后面一头牛差距为x
while(p + x + x <= a[i])p += x,cnt ++;
p = a[i];
}
while(p + x <= n)p += x,cnt ++;
return cnt >= 2;
}
int main()
{
cin >> n;
char str[N];cin >> str + 1;
for(int i = 1; i <= n; i ++)
if(str[i] == '1')a[++ m] = i;
int l = 0,r = n;
for(int i = 1; i < m; i ++) r = min(r, a[i+1] - a[i]);
//我们二分的是能放的最大距离x,这不一定是所有的ai都满足的101000001,比如我们的能放的最大的
//x是2,但是答案应该是1.因为我们没有特判所有的ai都是小于等于x的
while(l < r)
{
int mid = l + r + 1 >> 1;
if(check(mid))l = mid;
else r = mid - 1;
}
cout << l << endl;
return 0;
}