1. Задача составления расписания.

(открыть в новой вкладке)

Условие:

Есть уроки, которые можно провести, но только в определённое время. И есть учебный класс. Нужно провести в классе как можно больше уроков.





Алгоритм для решения задачи на удивление прост:
1. Нужно выбрать урок, завершающийся раньше всех. Это первый урок, который будет проведён в классе.
2. Затем выбирается урок, начинающийся после завершения первого урока. И снова следует выбрать урок, который завершается раньше всех остальных. Он становится вторым уроком в расписании.
3. Повторение 2-го пункта и т.д.

Ответ:



Код:

import copy

"""ФУНКЦИЯ ПРОВЕРКИ ОКОНЧАНИЯ ЦИКЛА."""
def function_check():
    temp = False
    for i in lessons_mod.values():
        if i[0] >= result[-1][-1][-1]:
            temp = True            
            break
    return temp

"""ВХОДНЫЕ ДАННЫЕ. ХЕШ-ТАБЛИЦА для всех уроков."""
lessons = {
    "Рисование": ("8:00","10:00"),
    "Английский язык": ("8:30","10:30"),
    "Математика": ("10:00","11:00"),
    "Информатика": ("10:30","11:30"),
    "Музыка": ("11:00","12:00")
}

"""ОСНОВНОЙ КОД."""
#######################################
# приведём данные к удобному виду
lessons_mod = {}
for lesson, schedule in lessons.items():
    lessons_mod[lesson] = [float(schedule[0].replace(":",".")), float(schedule[1].replace(":","."))]
# ПОЛУЧИЛОСЬ: lessons_mod {'Рисование': [8.0, 10.0], 'Английский язык': [8.3, 10.3], 'Математика': [10.0, 11.0], 'Информатика': [10.3, 11.3], 'Музыка': [11.0, 12.0]}
#######################################

"""ОПРЕДЕЛЕНИЕ ПЕРВОГО УРОКА."""
a = min(dict(lessons_mod.values()).values())                                                            # самое раннее время окончания первого урока из всех возможных
result = [[x, y] for x, y in lessons_mod.items() if y[-1] == a]                                         # результат с первым уроком, который будет дополняться далее --> [['Рисование', [8.0, 10.0]]]

"""ОСНОВНОЙ ЦИКЛ."""
#######################################
while function_check():
    for i in result:                                                                                    # в цикле убрать уроки, который стали определены в result из lesson_mod
        if i[0] in lessons_mod:
            del lessons_mod[i[0]]
    temp = copy.copy(lessons_mod)
    for a, b in temp.items():                                                                           # в цикле убрать предметы, которые не подходят
        if b[0] < result[-1][-1][-1]:
            del lessons_mod[a]
    a = min(dict(lessons_mod.values()).values())                                                        # самое раннее время окончания следующего урока из всех возможных
    for x, y in lessons_mod.items():
        if y[-1] == a:
            result.append([x, y])
#######################################

"""ПРИВЕДЁМ КОНЕЧНЫЙ РЕЗУЛЬТАТ К БОЛЕЕ КРАСИВОМУ ВИДУ."""
# сначала приведём переменнуя result к виду --> {'Рисование': '8:0-10:0', 'Математика': '10:0-11:0', 'Музыка': '11:0-12:0'}
result = dict(result)
temp = copy.copy(result)
for a, b in temp.items():
    temp_str = ""
    for i in b:
        temp_str += (str(i).replace(".",":") + "-")    
    result[a] = temp_str[:-1]
# выведем на экран расписание уроков
print()
for a, b in result.items():
    print(f"Урок: {a:>10}, Время: {b:>9}")
print()