• 1
    数据输入输出
    • 任务
  • 2
    条件语句
    • 任务
  • 3
    for循环
    • 任务
  • 4
    字符串
    • 任务
  • 5
    while循环
    • 任务
  • 6
    列表
    • 任务
  • 7
    二维数组
    • 任务
  • 8
    字典
    • 任务
  • 9
    集合
    • 任务
  • 10
    函数与递归
    • 任务
  • к

课程 5. While cycle

难度:

任务«酒店房间分配»

💻 Python

你在一家规模不大但非常受欢迎的宇宙酒店找到了一份管理员的工作。前任管理员在笔记本上记录客人的信息,导致混乱不断:客人被安排到已经有人入住的房间,或者相反,房间空置着,本可以租出去。经理给你布置了一项任务——实现客人房间分配流程的自动化。

你的程序必须接收预订申请列表,并为每个申请确定房间号。主要目标是——尽可能少地使用房间,以降低清洁和维护成本。只有在紧急情况下才应开放新房间。如果多个房间同时空出,客人应被安排到编号最小的房间。

正式条件:
你有一个包含 n 位客户的列表。每位客户已知其到达日期和离开日期。日期用整数编号。客人在到达日期的早晨入住房间,并在离开日期的早晨腾出房间。这意味着,如果一位客人在第 X 天离开,那么另一位客人可以在同一天 X 入住该房间。

你需要编写一个程序,为每位客户(按照他们输入的先后顺序)确定其将被安排入住的房间号。房间编号从 1 开始。算法应为“贪心”算法:始终尝试将新客人安排到之前使用过的、编号最小的可用房间,只有在没有空闲房间时才开放新房间。

 

输入格式

  n   行。每行包含两个由空格分隔的数字:  day_arrival   和   day_departure(整数)。这些行表示客户提交的申请,顺序可能是随机的。

最后会有一行 "end"。

输出格式

一行包含由空格分隔的 n 个数字。 i 行中的第 i 个数字是分配给原始列表中第 i 位客户的房间号。

示例

输入

1 5
8 10
2 4
6 9
1 3

结束

输出

1 2 2 1 3

提示

There will be no clue here, decide for yourself!

main.py
测试 1
测试 2
测试 3
测试 4
测试 5
测试 6
测试 7
测试 8
测试 9
测试 10
开发者解答
# Создаем пустой список для хранения заявок от клиентов
requests = []

# Используем цикл while для считывания всех заявок до слова "конец"
while True:
    # Считываем очередную строку ввода
    line = input()
    
    # Если введена строка "конец", выходим из цикла
    if line == "конец":
        break
    
    # Разделяем строку по пробелу и преобразуем части в целые числа
    arrival_day, departure_day = map(int, line.split())
    
    # Добавляем кортеж с днями прибытия и отъезда в список заявок
    requests.append((arrival_day, departure_day))

# Список для хранения дат отъезда для каждой занятой комнаты.
# Индекс списка - это (номер_комнаты - 1).
# Значение - день, когда комната освободится.
room_departure_dates = []

# Список для хранения результатов - номеров комнат для каждого клиента
assigned_rooms = []

# Инициализируем счетчик для цикла while, чтобы пройти по всем заявкам
request_index = 0

# Основной цикл, который обрабатывает каждую заявку последовательно
while request_index < len(requests):
    # Получаем данные текущего клиента
    current_arrival, current_departure = requests[request_index]
    
    # Флаг, который покажет, нашли ли мы комнату для клиента
    has_found_room = False
    
    # Инициализируем счетчик для поиска свободной комнаты
    room_index = 0
    
    # Вложенный цикл while для поиска подходящей комнаты среди уже существующих
    while room_index < len(room_departure_dates):
        # Комната считается свободной, если новый гость прибывает
        # в тот же день или позже, чем уезжает предыдущий гость.
        if current_arrival >= room_departure_dates[room_index]:
            # Мы нашли подходящую комнату! Обновляем для нее дату отъезда.
            room_departure_dates[room_index] = current_departure
            
            # Добавляем номер комнаты (индекс + 1) в список результатов
            assigned_rooms.append(room_index + 1)
            
            # Устанавливаем флаг, что комната найдена
            has_found_room = True
            
            # Прерываем поиск, так как мы должны выбрать комнату с наименьшим номером
            break
            
        # Переходим к проверке следующей комнаты
        room_index += 1
    
    # Если после проверки всех комнат свободная так и не нашлась
    if not has_found_room:
        # "Открываем" новую комнату, добавляя дату отъезда нового гостя в конец списка
        room_departure_dates.append(current_departure)
        
        # Номер новой комнаты будет равен текущему количеству комнат
        new_room_number = len(room_departure_dates)
        
        # Добавляем номер новой комнаты в список результатов
        assigned_rooms.append(new_room_number)
        
    # Переходим к обработке следующей заявки
    request_index += 1

# Выводим все назначенные номера комнат в одну строку через пробел
print(*assigned_rooms)

🎉 恭喜! 🎉

你出色地完成了任务!这是一个不小的挑战,但你找到了正确答案。你离编程大师又近了一步!继续保持,每一步都让你更强大。

AD

广告

red-snake blue-snake green-snake

正在运行代码...

AI助手

你好!我是你的编程助手。随时向我提问关于 Python 的问题——我可以解释函数、方法,并帮助你完成当前任务!