JustCaptain kod-buduschego
50dfea9f36e507ca9ff84a286d3a53bb4b714a7c
Перейти к файлу
Код
kod-buduschego Математическое моделированиеРешения02. Уровень 2.md
JustCaptain update math modeling 50dfea9 1 неделю назад
02. Уровень 2.md

Решения — уровень 2: учитываем остаток и условия#

5. Места на открытой лекции#

Строим модель#

Полные ряды можно убрать из рассмотрения: в каждом из них свободных мест нет. Остаток N % C показывает, сколько гостей сидит в последнем ряду.

  • Если остаток равен 0, последний ряд заполнен целиком, свободных мест 0.
  • Если остаток не равен 0, свободно C - остаток мест.

Проверка#

47 = 3 * 12 + 11: три ряда заполнены полностью, в последнем сидят 11 гостей из 12. Остаётся одно место.

C++#

#include <iostream>
using namespace std;

int main() {
    long long guests, seatsPerRow;
    cin >> guests >> seatsPerRow;

    long long remainder = guests % seatsPerRow;
    long long emptySeats = (remainder == 0) ? 0 : seatsPerRow - remainder;

    cout << emptySeats << '\n';
    return 0;
}

6. Покраска стены#

Строим модель#

Площадь стены — W * H. Дверь занимает D1 * D2, окно — X1 * X2. Вычитаем непокрашиваемые площади:

paintArea = W * H - D1 * D2 - X1 * X2.

Если одного литра хватает на C квадратных метров, для paintArea нужно paintArea / C литров. Но краска продаётся целыми литрами, поэтому дробную часть нужно округлить вверх. Для положительного числителя и знаменателя целочисленное округление вверх можно получить так:

paintArea / C + (paintArea % C != 0).

Проверка#

Площадь стены — 24 м², проёмы занимают 2 + 2 = 4 м². Красят 20 м². Двух литров хватит на 16 м², поэтому нужен третий литр.

C++#

#include <iostream>
using namespace std;

int main() {
    long long w, h, doorW, doorH, windowW, windowH, coverage;
    cin >> w >> h >> doorW >> doorH >> windowW >> windowH >> coverage;

    long long paintArea = w * h - doorW * doorH - windowW * windowH;
    long long liters = paintArea / coverage;
    if (paintArea % coverage != 0) {
        ++liters;
    }

    cout << liters << '\n';
    return 0;
}

7. Пожертвование с поддержкой спонсора#

Строим модель#

Каждый пожертвованный рубль увеличивает общий сбор на 3 рубля: 1 рубль от участника и 2 рубля от спонсора. Если до цели не хватает need = T - M, нужно минимальное целое x, для которого 3x ≥ need.

Если цель уже достигнута (M ≥ T), ответ 0. Иначе округляем need / 3 вверх. В целых числах это need / 3 плюс один, если есть остаток.

Проверка#

До цели не хватает 1000 - 730 = 270 рублей. Каждые 3 рубля сбора получаются с одного пожертвованного рубля, значит, достаточно 270 / 3 = 90 рублей.

C++#

#include <iostream>
using namespace std;

int main() {
    long long collected, target;
    cin >> collected >> target;

    long long donation = 0;
    if (collected < target) {
        long long need = target - collected;
        donation = need / 3;
        if (need % 3 != 0) {
            ++donation;
        }
    }

    cout << donation << '\n';
    return 0;
}

8. Прокат автомобиля#

Строим модель#

Первые 120 минут включены в базовую стоимость. Если прокат длился дольше, считаем лишние минуты extra = T - 120.

Каждый начатый дополнительный час тарифицируется целиком. Поэтому число платных часов равно целой части extra / 60 плюс один, если после деления есть остаток. Итоговая стоимость — базовая стоимость плюс цена всех дополнительных часов.

Проверка#

При 181 минуте после первых 120 остаётся 61 минута. Это два начатых часа: 60 + 120 * 2 = 240. Вместе с базовыми 500 рублями получается 740 рублей.

C++#

#include <iostream>
using namespace std;

int main() {
    long long minutes, basePrice, hourlyPrice;
    cin >> minutes >> basePrice >> hourlyPrice;

    long long cost = basePrice;
    if (minutes > 120) {
        long long extraMinutes = minutes - 120;
        long long paidHours = extraMinutes / 60;
        if (extraMinutes % 60 != 0) {
            ++paidHours;
        }
        cost += paidHours * hourlyPrice;
    }

    cout << cost << '\n';
    return 0;
}