最大社交距离

题目描述

疫情期间需要大家保证一定的社交距离, 公司组织开交流会议. 座位一排共 N 个座位, 编号分别为 [0, N-1],

要求员工一个接着一个进入会议室, 并且可以在任何时候离开会议室.

满足:

  • 每当一个员工进入时, 需要坐到最大社交距离, 最大化自己和其他人的距离的座位
  • 如果有多个这样的座位, 则坐到索引最小的那个座位

输入描述

  • 会议室座位总数 seatNum
    • 1 ≤ seatNum ≤ 500
  • 员工的进出顺序 seatOrLeave 数组
    • 元素值为 1, 表示进场
    • 元素值为负数, 表示出场, 特殊位置 0 的员工不会离开
    • 例如 -4 表示坐在位置 4 的员工离开, 保证有员工坐在该座位上

输出描述

最后进来员工, 他会坐在第几个位置, 如果位置已满, 则输出-1.

示例1

输入:

10
[1, 1, 1, 1, -4, 1]

输出:

5

题解

Python

def main():
    # 读取输入
    # 座位的数量
    num_seat = int(input())
    assert 1 <= num_seat <= 500
    # 进出的序列
    line = input()[1:-1]
    # 1 表示进入会议室, 负数表示从该位置离开会议室
    enter_leave_list = list(map(int, line.split(",")))
    assert enter_leave_list

    # 下一个进入的员工可以占用的位置
    new_position = -1
    # 当前在会议室的所有员工占用的位置
    # 这个序列在有员工进出时都要更新
    seat = []

    # 遍历所有进出序列
    for op in enter_leave_list:
        # 有员工离开
        if op < 0:
            # 得到离开员工的位置
            position = -op
            # 并将该位置移除
            seat.remove(position)
            continue
        
        # 有员工进入会议室, 给他安排位置
        assert op == 1

        if not seat:
            # 当会议室为空时, 要坐在位置0, 而且之后这个位置上的员工不再变动
            new_position = 0
        elif len(seat) == num_seat:
            # 当会议室满了后, 新进入的员工没有位置
            new_position = -1
        else:
            # 找出最大空闲位置
            max_dist = 0
            new_position = 0
            # 遍历已有位置序列
            for index, position in enumerate(seat):
                # 当前位置的距离
                distance = 0
                if index + 1 == len(seat):
                    # 最后一个位置到当前位置的距离
                    distance = num_seat - 1 - position
                else:
                    # 相邻两个位置的中间距离
                    distance = (seat[index + 1] - position) // 2
                # 更新最大距离
                if distance > max_dist:
                    max_dist = distance
                    # 更新新进入员工的位置
                    if index + 1 == len(seat):
                        # 最后一个位置
                        new_position = num_seat - 1
                    else:
                        # 相邻两个位置的中间位置
                        new_position = position + distance

        if new_position != -1:
            # 将新进入的员工排好位
            seat.append(new_position)
            seat.sort()

    # 打印最终的结果
    print(new_position)

if __name__ == "__main__":
    main()