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;
}

很多时候不会做或者做错,或许只是因为读错了题。要相信自己,然后耐心的重新读题。

原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758723.html