python排监考的问题,不知道怎么办了

用python排监考场次的问题,没有什么思路,有没有人帮帮忙呀

img



nums = [{'tm':0,'科目':[]} for _ in range(29)]

场次 = {
    '语文' : [13,120],
    '英语' : [16,100],
    '数学' : [16,100],
    '物理' : [8,60],
    '道法' : [8,60],
    '历史' : [8,50],
    '化学' : [8,50]
      }

total = sum([场次[k][0] for k in 场次])

while len(场次) > 0:
    科目 = list(场次.keys())[0]
    场数,时间 = 场次[科目]
    nums.sort(key = lambda x:x['tm'])
    for i in range(场数):
        nums[i]['科目'].append(科目)
        nums[i]['tm'] += 时间
    del 场次[科目]

for teacher in nums:
    print('监考科目:{},用时:{}'.format(teacher['科目'],teacher['tm']))
'''
runfile('C:/Users/sosome/未命名1.py', wdir='C:/Users/sosome')
监考科目:['语文', '物理', '化学'],用时:230
监考科目:['语文', '物理', '化学'],用时:230
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学', '化学'],用时:250
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['英语', '数学'],用时:200
监考科目:['语文', '道法', '历史'],用时:230
监考科目:['语文', '道法', '历史'],用时:230
监考科目:['语文', '道法', '历史'],用时:230
监考科目:['语文', '道法', '历史'],用时:230
监考科目:['语文', '道法', '历史'],用时:230
监考科目:['语文', '物理', '历史'],用时:230
监考科目:['语文', '物理', '历史'],用时:230
监考科目:['语文', '物理', '历史'],用时:230
监考科目:['语文', '物理', '道法'],用时:240
监考科目:['语文', '物理', '道法'],用时:240
监考科目:['语文', '物理', '道法'],用时:240
'''

这个可以用动态规划算法来实现的。

该回答引用GPTᴼᴾᴱᴺᴬᴵ

# 定义一个 Exam 类,表示一场考试
class Exam:
    def __init__(self, name, time):
        self.name = name  # 考试名称
        self.time = time  # 电脑使用时间
        self.assigned_to = None  # 被分配的监考人员编号

# 定义一个 assign_exams 函数,输入参数为考试列表和每个人的最高监考时间限制
def assign_exams(exams, max_time):
    # 对考试按照电脑使用时间从小到大排序
    exams = sorted(exams, key=lambda x: x.time)

    # 初始化每个人的监考次数和总监考时间
    people = {i: {'count': 0, 'time': 0} for i in range(1, 11)}

    # 遍历每个考试,安排监考人员
    for exam in exams:
        # 找出已经监考次数最少的人员
        min_person = min(people.keys(), key=lambda x: people[x]['count'])

        # 如果该人员的总监考时间超过最高限制,则跳过该考试
        if people[min_person]['time'] + exam.time > max_time:
            continue

        # 将该考试安排给该人员,更新该人员的监考次数和总监考时间
        exam.assigned_to = min_person
        people[min_person]['count'] += 1
        people[min_person]['time'] += exam.time

    # 返回安排好监考人员的考试列表
    return exams

# 示例用法
if __name__ == '__main__':
    # 定义一些考试和每场考试的电脑使用时间
    exam_names = ['Exam A', 'Exam B', 'Exam C', 'Exam D', 'Exam E', 'Exam F']
    exam_times = [120, 90, 180, 150, 210, 240]

    # 创建考试列表
    exams = [Exam(name, time) for name, time in zip(exam_names, exam_times)]

    # 调用 assign_exams 函数,分配监考人员
    max_time = 250  # 每个人的最高监考时间限制
    assigned_exams = assign_exams(exams, max_time)

    # 输出分配结果
    for exam in assigned_exams:
        print(f'{exam.name}: assigned to {exam.assigned_to}')


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632