1660. 社交距离 II

摘要
Title: 1660. 社交距离 II
Tag: 二分、贪心、双指针
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1660. 社交距离 II

  • 题意

    由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。
    尽管他尽了最大努力使他的 N 头奶牛们践行“社交距离”,还是有许多奶牛不幸染上了疾病。
    编号为 1…N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 i 位于位置 xi。
    Farmer John 知道存在一个半径 R,任何与一头被感染的奶牛距离不超过 R 单位的奶牛也会被感染(然后会传染给与其距离 R 单位内的奶牛,以此类推)。
    不幸的是,Farmer John 并不确切知道 R 的值。
    他只知道他的哪些奶牛被感染了。
    给定这个数据,求出起初感染疾病的奶牛的最小数量。

  • 思路

    具体思路

    • 先把0和1的分开,并且进行排序
    • 遍历0的元素,并在1中二分找这个0是在哪两个1中间(为了防止有的0是在开端和结尾,就给开端和结尾加上无穷),这样就可以求出最小的R
    • 之后双指针遍历1列表,根据R看哪几个是同类
    • 复杂度总共O(nlogn)O(nlogn)
  • 代码

    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
    '''
    Author: NEFU AB-IN
    Date: 2022-02-16 09:44:56
    FilePath: \ACM\Acwing\1660.py
    LastEditTime: 2022-02-16 10:38:22
    '''
    from bisect import bisect_left

    INF = int(2e9)
    a = [] #装1
    b = [] #装0

    if __name__ == "__main__":
    n = int(input())
    for i in range(n):
    x, op = map(int, input().split())
    if op == 1:
    a.append(x)
    else:
    b.append(x)

    a.sort()
    b.sort()
    dis = INF
    a = [-INF, *a, INF]
    for i in range(len(b)):
    id = bisect_left(a, b[i]) - 1
    dis = min(dis, min(a[id + 1] - b[i], b[i] - a[id]))
    res = 0
    i, j = 1, 1
    n = len(a) - 1
    while i < n and j + 1 < n:
    j = i + 1
    while j < n and a[j] - a[i] < dis:
    j += 1
    i += 1
    res += 1
    i += 1

    if a[n - 1] - a[n - 2] >= dis:
    res += 1
    print(res)
使用搜索:谷歌必应百度