• 1
    إدخال وإخراج البيانات
    • المهام
  • 2
    الشروط
    • المهام
  • 3
    حلقة for
    • المهام
  • 4
    السلاسل النصية
    • المهام
  • 5
    حلقة while
    • المهام
  • 6
    القوائم
    • المهام
  • 7
    مصفوفات ثنائية الأبعاد
    • المهام
  • 8
    القواميس
    • المهام
  • 9
    المجموعات
    • المهام
  • 10
    الدوال والتكرار
    • المهام
  • к

درس 5. While cycle

الصعوبة:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

مسألة«توزيع غرف الفندق»

💻 Python

حصلت على وظيفة كمسؤول في فندق صغير ولكنه مشهور جدًا يُدعى كوزموس. كان المسؤول السابق يسجل بيانات النزلاء في دفتر ملاحظات، وكان ينشأ ارتباك باستمرار: كان النزلاء يُسكنون في غرف مشغولة بالفعل، أو على العكس، كانت الغرف تظل فارغة على الرغم من إمكانية تأجيرها. كلفك المدير بمهمة & mdash; أتمتة عملية توزيع النزلاء على الغرف.


يجب أن يقبل برنامجك قائمة طلبات الحجز ويحدد رقم الغرفة لكل طلب. الهدف الرئيسي & mdash; استخدام أقل عدد ممكن من الغرف لتقليل تكاليف التنظيف والصيانة. يجب فتح غرف جديدة فقط في حالات الضرورة. إذا تم تحرير عدة غرف، فيجب إسكان النزيل في الغرفة ذات الرقم الأصغر.


الشرط الرسمي:
لديك قائمة مكونة من & nbsp; n & nbsp; عميل. لكل عميل، يُعرف يوم وصوله ويوم مغادرته. الأيام مرقمة بأعداد صحيحة. يشغل النزيل الغرفة في صباح يوم الوصول ويحررها في صباح يوم المغادرة. هذا يعني أنه إذا غادر أحد النزلاء في اليوم X، فيمكن لنزيل آخر أن يسكن في هذه الغرفة في نفس اليوم X.


تحتاج إلى كتابة برنامج يحدد لكل عميل (بنفس الترتيب الذي تم إدخالهم به) رقم الغرفة التي سيُسكن فيها. يبدأ ترقيم الغرف من 1. يجب أن تكون الخوارزمية "جشعة": حاول دائمًا إسكان نزيل جديد في غرفة مستخدمة سابقًا بأقل رقم ممكن، وفقط إذا لم تكن هناك غرف شاغرة & mdash; افتح غرفة جديدة.


& nbsp;

تنسيق الإدخال

  n   سطر. يحتوي كل سطر على رقمين مفصولين بمسافة:   day_arrival   و   day_departure (أعداد صحيحة). تمثل هذه الأسطر طلبات العملاء ويمكن أن تكون بترتيب عشوائي.

في النهاية سيكون هناك سطر "end".

تنسيق الإخراج

سطر واحد يحتوي على   n   أرقام مفصولة بمسافة.   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

جارٍ تشغيل الكود...

مساعد الذكاء الاصطناعي

مرحباً! أنا مساعدك في البرمجة. اسألني أي شيء عن Python — يمكنني شرح الدوال والطرق ومساعدتك في المهمة الحالية!