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

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

  • 相关阅读:
    LoadScript
    Mac终端Terminal调用Sublime Text
    jquery ajax 提交 FormData
    ps切图设置
    bootstrap-select搜索框输入中文
    Homebrew安装
    清空file input框
    javascript 随机数区间
    Canvas与Image互转
    html空格小结
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758723.html
Copyright © 2020-2023  润新知