AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 1659. 社交距离 I 0.01 AC币

作者: 作者的头像   Liyb ,  2022-08-06 20:51:51 ,  所有人可见 ,  阅读 6


0


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

0 评论

你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息