1659. 社交距离 I

摘要
Title: 1659. 社交距离 I
Tag: 二分
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1659. 社交距离 I

  • 题意

    一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播。
    Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染。
    Farmer John 的牛棚是一个狭长的建筑物,有一排共 N 个牛栏。
    有些牛栏里目前有奶牛,有些目前空着。
    得知“社交距离”的重要性,Farmer John 希望使得 D 尽可能大,其中 D 为最近的两个有奶牛的牛栏的距离。
    例如,如果牛栏 3 和 8 是最近的有奶牛的牛栏,那么 D=5。
    最近两头奶牛新来到 Farmer John 的牛群,他需要决定将她们分配到哪两个之前空着的牛栏。
    请求出他如何放置这两头新来的奶牛,使得 D 仍然尽可能大。
    Farmer John 不能移动任何已有的奶牛;他只想要给新来的奶牛分配牛栏

  • 思路

    核心思路就是,二分距离D,能成立的的条件,就是这个0距离前面1和距离后面1的距离都大于等于D
    实现:

    • 处理next数组,next[i]next[i]用来表示离这个0最近的右边1的下标
    • 找到二分上界,即现有的奶牛中,1和1之间的最近距离
    • 二分D即可
      • 二分时动态记录一个pre, 代表上一个离得最近的1的位置
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    '''
    Author: NEFU AB-IN
    Date: 2022-03-23 17:01:00
    FilePath: \ACM\Acwing\1659.py
    LastEditTime: 2022-03-23 21:10:19
    '''
    N = int(1e5 + 10)
    nxt = [0] * N
    INF = int(2e9)


    def check(x):
    cnt = 0
    i, id = 0, -INF
    while i < n:
    if a[i] == 0 and i - id >= x and nxt[i] - i >= x:
    cnt += 1
    id = i
    if a[i] == 1:
    id = i
    i += 1
    return cnt >= 2


    n = int(input())
    a = list(map(int, input()))

    #求next数组,即0的下一个1在哪
    id = INF
    for i in range(n - 1, -1, -1):
    if a[i] == 0:
    nxt[i] = id
    else:
    id = i

    #求1之间的最小距离,也就是二分上界
    id = -INF
    r = n - 1
    for i in range(n):
    if a[i] == 1:
    if id != -INF:
    r = min(r, i - id)
    id = i
    # 二分D
    l = 1
    while l < r:
    mid = l + r + 1 >> 1
    if check(mid):
    l = mid
    else:
    r = mid - 1
    print(r)
使用搜索:谷歌必应百度