zoukankan      html  css  js  c++  java
  • 力扣855题(考场就座)

    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)
  • 相关阅读:
    LIB和 DLL区别
    C++ STL总结
    浅谈static和extern关系
    死锁及处理
    函数模板与模板函数
    Linux无法启动httpd_正在启动httpd
    httpd不允许远程连接问题
    虚拟机UUIDexist_更改UUID
    MySQL远程连接丢失问题
    Apache服务端允许跨域
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/15216731.html
Copyright © 2011-2022 走看看