Codeforces 645C Enduring Exodus【二分】
题目链接:
http://codeforces.com/contest/645/problem/C
题意:
给定01串,将k头牛和农夫放进, 0表示可以放进,1表示不可放进,求农夫距离其牛的最大距离的最小值。
分析:
第一遍读题没看清,直接写成dp。。。然后样例都不过,我开始怀疑人生怀疑自己。。。。。
后来发现是要求中间的到两边的最大距离的最小值,而对于某个距离是否满足条件很好判断啊~~所以直接二分最大距离即可~
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 5;
int t[maxn];
int n, m;
string s;
bool judge(int dist)
{
for(int i = 0; i < n; i++){
if(s[i] == '1') continue;
int l = max(0, i - dist );
int r = min(i + dist, n - 1);
if(t[r] - t[l - 1] >= m) return true;
}
return false;
}
int main (void)
{
cin>>n>>m>>s;
m++;
for(int i = 0; i < n; i++){
t[i] = t[i - 1] + (s[i] == '0');
}
int lb = 0, rb = n;
while(lb < rb - 1 ){
int mid = (lb + rb + 1) / 2;
if(judge(mid)) rb = mid;
else lb = mid;
}
cout<<rb<<endl;
return 0;
}
很多时候不会做或者做错,或许只是因为读错了题。要相信自己,然后耐心的重新读题。