855、考场就座
基本思想:
将每两个相邻考生看成线段的两个端点,新安排考生就是找最长的线段,然后让该考生在中间把这个线段‘二分’,重点就是给他分配的位置。
看不懂的时候自己动手写一个例子
代码:
class ExamRoom(object): def __init__(self, N): self.N = N self.students = [] def seat(self): if not self.students: student = 0 else: #dist距离最近的学生的距离 #从最左边的位置开始 dist, student = self.students[0], 0 for i, s in enumerate(self.students): if i: prev = self.students[i-1] # 每一对相邻学生的位置 (prev, s), # prev + d位置是新来的学生. d = (s - prev) // 2 # 计算待插入student与相邻student的距离 if d > dist: dist, student = d, prev + d # 考虑最右边的位置 d = self.N - 1 - self.students[-1] if d > dist: student = self.N - 1 # Add the student to our sorted list of positions. bisect.insort(self.students, student) return student def leave(self, p): if p in self.students: self.students.remove(p)