思路
- 题意:对于连续房间,选择k+1个房间给1个人和k个牛住,求人离牛的最大距离最小是多少
- 方法:枚举人的位置,然后二分即可
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
char s[N];
int sum[N];
int n,k;
int main(){
cin >> n >> k >> s+1;
int res=n;
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+('1'-s[i]);
}
for(int i=1;i<=n;i++){
if(s[i]=='0'){
int l=1;
int r=n;
while(l<r){
int mid=(l+r)>>1;
if(sum[min(n,i+mid)]-sum[max(i-mid-1,0)]>k){
r=mid;
}
else l=mid+1;
}
if(sum[min(n,i+l)]-sum[max(i-l-1,0)]>k)res=min(res,l);
}
}
cout << res;
}