Загрузка данных


using System;
using System.Collections.Generic;

class Employee
{
    public string Name { get; }
    public int Stamina { get; private set; } = 100;

    public bool OnBreak { get; private set; }
    public int BreakHoursLeft { get; private set; }

    public Employee(string name)
    {
        Name = name;
    }

    public bool CanWork => !OnBreak && Stamina > 0;

    public void WorkOneHour()
    {
        if (!CanWork) return;

        Stamina = Math.Max(0, Stamina - 20);

        // При низкой стамине сотрудник автоматически уходит на перерыв.
        if (Stamina <= 40)
        {
            OnBreak = true;
            BreakHoursLeft = 2;
        }
    }

    public void RestOneHour()
    {
        if (!OnBreak) return;

        Stamina = Math.Min(100, Stamina + 35);
        BreakHoursLeft--;

        if (BreakHoursLeft <= 0)
        {
            OnBreak = false;
        }
    }
}

class Program
{
    static void Main()
    {
        int checkoutCount = 4;

        var employees = new List<Employee>
        {
            new Employee("Анна"),
            new Employee("Борис")
        };

        for (int hour = 9; hour < 21; hour++)
        {
            Console.WriteLine($"\n--- {hour}:00 ---");

            // Сначала отдыхают сотрудники, которые уже на перерыве.
            foreach (Employee employee in employees)
            {
                if (employee.OnBreak)
                    employee.RestOneHour();
            }

            int openCheckouts = 0;

            // Назначаем доступных сотрудников на кассы.
            foreach (Employee employee in employees)
            {
                if (openCheckouts >= checkoutCount)
                    break;

                if (employee.CanWork)
                {
                    openCheckouts++;
                    employee.WorkOneHour();
                    Console.WriteLine(
                        $"{employee.Name} работает. Стамина: {employee.Stamina}%.");
                }
                else if (employee.OnBreak)
                {
                    Console.WriteLine(
                        $"{employee.Name} на перерыве. Стамина: {employee.Stamina}%.");
                }
                else
                {
                    Console.WriteLine(
                        $"{employee.Name} отдыхает, чтобы восстановить силы. Стамина: {employee.Stamina}%.");
                }
            }

            int closedCheckouts = checkoutCount - openCheckouts;
            if (closedCheckouts > 0)
            {
                Console.WriteLine($"Свободных касс закрыто: {closedCheckouts}.");
            }

            // Показываем состояние всех сотрудников, включая отдыхающих.
            Console.WriteLine("Состояние сотрудников:");
            foreach (Employee employee in employees)
            {
                string status = employee.OnBreak ? "перерыв" :
                    employee.CanWork ? "готов работать" : "восстанавливается";

                Console.WriteLine(
                    $"  {employee.Name}: стамина {employee.Stamina}%, {status}.");
            }
        }

        Console.WriteLine("\n=== Остаток стамины в конце дня ===");
        foreach (Employee employee in employees)
        {
            Console.WriteLine($"{employee.Name}: {employee.Stamina}%.");
        }
    }
}