update math modeling
Родитель:
a33efd8
· сравнить с родителем
6 файлов
-
Показать разницуСкрыть разницу
1 +# Математическое моделирование 2 + 3 +## Как перейти от условия задачи к формуле и программе 4 + 5 +Математическое моделирование — это описание ситуации с помощью величин, связей и ограничений. Полученная модель помогает ответить на вопрос задачи, а затем записать решение в виде программы. 6 + 7 +**Условие → величины → связи и ограничения → модель → вычисления → проверка → код** 8 + 9 +Формула — лишь часть модели. Важно понять, что обозначают её величины, почему они связаны именно так и при каких условиях формула верна. 10 + 11 +--- 12 + 13 +## 1. С чего начать 14 + 15 +Прочитай условие и найди четыре элемента: 16 + 17 +1. **Дано:** какие значения известны? 18 +2. **Найти:** что именно нужно вывести — сумму, количество, минимум, максимум, остаток или ответ «да/нет»? 19 +3. **Связи:** как величины зависят друг от друга? 20 +4. **Ограничения:** какие ответы допустимы — целые, положительные, не меньше заданного значения, в пределах вместимости? 21 + 22 +Полезно составить таблицу: 23 + 24 +| Величина | Смысл | Известна или неизвестна | 25 +|---|---|---| 26 +| `P` | стоимость нужного предмета | известна | 27 +| `S` | сколько денег уже накоплено | известна | 28 +| `a` | сколько удаётся откладывать за неделю | известно | 29 +| `w` | сколько недель копить | неизвестна | 30 + 31 +Таблица помогает отличить входные данные от искомого и не смешать величины с разными смыслами. 32 + 33 +--- 34 + 35 +## 2. Пошаговый способ построить модель 36 + 37 +### Шаг 1. Сформулируй вопрос задачи 38 + 39 +Например: нужно ли найти точное количество или минимальное количество, которого достаточно? Минимум и максимум часто требуют дополнительного условия или сравнения. 40 + 41 +### Шаг 2. Назови величины и единицы измерения 42 + 43 +Запиши, что означает каждая буква. Следи, чтобы в одной формуле не смешивались, например, метры и сантиметры или минуты и часы. 44 + 45 +### Шаг 3. Перескажи условие своими словами 46 + 47 +Опиши, как устроена ситуация, не используя код. Если в пересказе теряется важное условие — перечитай задачу. 48 + 49 +### Шаг 4. Запиши связь 50 + 51 +Определи, что складывается, повторяется, делится, сравнивается или меняется. Если искомое заранее неизвестно, обозначь его переменной. 52 + 53 +### Шаг 5. Учти все изменения и ограничения 54 + 55 +Если после действия меняется несколько величин, обнови каждую. Если в условии сказано «не менее», «не более», «минимум» или «только целое число», это должно отразиться в модели. 56 + 57 +### Шаг 6. Реши модель 58 + 59 +Упрости формулу или реши уравнение/неравенство. Если ответ должен быть целым, отдельно разберись с округлением и остатком. 60 + 61 +### Шаг 7. Проверь результат 62 + 63 +Подставь ответ обратно в условие. Для минимального значения проверь также предыдущее число: оно должно условие уже не выполнять. 64 + 65 +### Шаг 8. Перенеси решение в код 66 + 67 +Только после того, как модель понятна, выбирай типы данных, операторы и порядок вычислений. 68 + 69 +--- 70 + 71 +## 3. Пример построения модели 72 + 73 +**Ситуация.** Велосипед стоит 2000 рублей. Уже накоплено 650 рублей. Каждую неделю удаётся откладывать ещё по 150 рублей. Сколько недель нужно копить, чтобы денег хватило? Для программы предположим, что недельное накопление `perWeek` положительно. 74 + 75 +Обозначим число недель через `w`. После `w` недель будет `650 + 150w` рублей. Денег должно быть не меньше стоимости велосипеда: 76 + 77 +`650 + 150w ≥ 2000`. 78 + 79 +Отсюда `150w ≥ 1350`, значит, `w ≥ 9`. Число недель должно быть целым, поэтому нужно 9 недель. 80 + 81 +**Проверка:** за 8 недель накопится `650 + 8 · 150 = 1850` рублей — недостаточно. За 9 недель — 2000 рублей, то есть ровно хватает. 82 + 83 +```cpp 84 +#include <iostream> 85 +using namespace std; 86 + 87 +int main() { 88 + long long price, saved, perWeek; 89 + cin >> price >> saved >> perWeek; 90 + 91 + long long need = price - saved; 92 + long long weeks = 0; 93 + 94 + if (need > 0) { 95 + weeks = need / perWeek; 96 + if (need % perWeek != 0) { 97 + ++weeks; 98 + } 99 + } 100 + 101 + cout << weeks << '\n'; 102 + return 0; 103 +} 104 +``` 105 + 106 +Пример показывает важную мысль: модель включает не только формулу накоплений, но и требование «денег должно быть не меньше цены», а ответ нужно округлить до целого числа недель вверх. 107 + 108 +--- 109 + 110 +## 4. Частые связи и ограничения 111 + 112 +| Формулировка | Что проверить в модели | 113 +|---|---| 114 +| «всего», «вместе» | Какие части складываются? Не учтена ли одна часть дважды? | 115 +| «по `a` на каждый из `n` объектов» | Повторяется ли одна и та же величина `n` раз? | 116 +| «не менее» | Обычно требуется сравнение `≥`. | 117 +| «не более» | Обычно требуется сравнение `≤`. | 118 +| «каждые начавшиеся…» | Есть ли неполный интервал, который нужно считать целиком? | 119 +| «минимальное число групп, чтобы вместить всех» | Неполная последняя группа тоже требует отдельного места. | 120 +| «остаток» | Используется деление с остатком. | 121 +| «на сколько процентов» | От какой исходной величины считается процент? | 122 +| «за каждый шаг становится на `d` больше» | Есть ли последовательность с постоянным приращением? | 123 +| «максимальная площадь/прибыль» | Какие величины можно выбирать и какое ограничение связывает выбор? | 124 + 125 +Слова дают подсказку, но не заменяют понимание. Например, «не менее 10» означает `≥ 10`, а «больше 10» — строго больше 10. 126 + 127 +--- 128 + 129 +## 5. Округление и целые числа 130 + 131 +В задачах программирования деление целых чисел отбрасывает дробную часть. Это удобно, когда нужны полные группы или остаток, но не всегда даёт правильный ответ для минимального количества. 132 + 133 +### Полные группы и остаток 134 + 135 +Для `N` объектов и группы вместимостью `C`: 136 + 137 +- `N / C` — число полных групп; 138 +- `N % C` — остаток. 139 + 140 +### Минимальное число групп 141 + 142 +Если `N` не делится на `C`, для остатка нужна ещё одна группа. Безопасная запись: 143 + 144 +```cpp 145 +long long groups = N / C; 146 +if (N % C != 0) { 147 + ++groups; 148 +} 149 +``` 150 + 151 +Так округляют вверх, не прибавляя `C - 1` к большому числу. 152 + 153 +### Минимальное число шагов 154 + 155 +Если за один шаг величина увеличивается на `a`, а не хватает `need`, то число шагов должно быть не меньше `need / a`. При ненулевом остатке нужен ещё один шаг. 156 + 157 +Перед таким вычислением проверь особый случай: возможно, требование уже выполнено и шагов нужно 0. 158 + 159 +--- 160 + 161 +## 6. Проверка модели на примерах 162 + 163 +Проверяй не только пример из условия, но и крайние случаи: 164 + 165 +- минимальные допустимые значения; 166 +- ровно хватает — остатка нет; 167 +- не хватает одного объекта или одной единицы; 168 +- условие уже выполнено до начала действий; 169 +- число находится точно на пороге; 170 +- в последней группе остаётся один объект; 171 +- при максимальном входе результат не выходит за допустимый диапазон. 172 + 173 +Для подсчёта структуры нарисуй маленький случай и перечисли, что именно считаешь. Для минимума проверь ответ и число на единицу меньше. Для максимума сравни соседние допустимые варианты или объясни, почему дальше значение уже уменьшается. 174 + 175 +--- 176 + 177 +## 7. Как развивать навык 178 + 179 +### На каждой задаче проговаривай ход рассуждения 180 + 181 +1. Что означает каждая величина? 182 +2. Что требуется найти? 183 +3. Какие величины складываются или меняются? 184 +4. Какое условие должно выполняться? 185 +5. Почему выбранная формула это условие описывает? 186 +6. Как проверить ответ? 187 + 188 +### Снимай подсказки постепенно 189 + 190 +- Сначала используй таблицу «дано — найти — связь». 191 +- Затем оставь себе только вопросы: «что меняется?», «где граница?», «есть ли остаток?». 192 +- Потом решай задачу без опор и записывай модель до кода. 193 +- Возвращайся к похожим задачам с другими числами и сюжетом, чтобы проверить, понял ли ты связь, а не запомнил ответ. 194 + 195 +### Разбирай ошибки по шагам 196 + 197 +После ошибки выясни, где она появилась: при чтении условия, выборе величин, записи связи, округлении, вычислении или проверке. Исправляй именно этот шаг. Например, если часто забывается неполная группа, отдельно тренируй задачи с остатком и минимальным количеством. 198 + 199 +### Объясняй решение своими словами 200 + 201 +Если можешь объяснить смысл каждой переменной, обосновать формулу и проверить граничный случай, значит, модель понята. Если решение получается только после подстановки чисел в код, вернись к условию и выпиши связи между величинами. 202 + 203 +--- 204 + 205 +## Порядок работы 206 + 207 +Сначала решай задачи из файла **«Задачи.md»**, записывая модель до написания программы. Разборы и варианты решений на C++ находятся отдельно, в папке **«Решения»**. -
Показать разницуСкрыть разницу
1 +# Задачи по математическому моделированию 2 + 3 +В каждой задаче сначала определи известные величины и то, что требуется найти. Запиши связь между величинами и проверь её на примере — затем переходи к коду. 4 + 5 +## Уровень 1. Переводим ситуацию в выражение 6 + 7 +В этих задачах нужно выделить нужные величины, учесть единицы измерения и составить выражение. 8 + 9 +### 1. Рассада для теплицы 10 + 11 +В теплице подготовили `B` грядок. На каждой грядке высадят по `P` кустов. Сколько кустов потребуется всего? 12 + 13 +**Входные данные:** два целых числа `B` и `P` (`1 ≤ B, P ≤ 1 000 000`). 14 + 15 +**Выходные данные:** общее число кустов. 16 + 17 +**Пример** 18 +```text 19 +Ввод: 8 17 20 +Вывод: 136 21 +``` 22 + 23 +### 2. Корм для приюта 24 + 25 +В приюте живут `A` взрослых собак и `K` щенков. Взрослой собаке нужно `G1` граммов корма в день, щенку — `G2` граммов. Сколько граммов корма нужно на `D` дней? 26 + 27 +**Входные данные:** пять целых чисел `A`, `K`, `G1`, `G2`, `D` (`0 ≤ A, K ≤ 1 000 000`; `1 ≤ G1, G2, D ≤ 1 000 000`). Гарантируется, что ответ не превышает `10^18`. 28 + 29 +**Выходные данные:** общее количество корма в граммах. 30 + 31 +**Пример** 32 +```text 33 +Ввод: 4 3 250 120 5 34 +Вывод: 6800 35 +``` 36 + 37 +### 3. Аквариум 38 + 39 +Прямоугольный аквариум имеет внутренние размеры `L × W × H` сантиметров. Определите его вместимость в литрах. В одном литре — 1000 кубических сантиметров. Размеры подобраны так, что вместимость получается целым числом литров. 40 + 41 +**Входные данные:** три целых числа `L`, `W`, `H` (`1 ≤ L, W, H ≤ 1 000 000`); `L · W · H` делится на 1000. 42 + 43 +**Выходные данные:** вместимость аквариума в литрах. 44 + 45 +**Пример** 46 +```text 47 +Ввод: 50 20 30 48 +Вывод: 30 49 +``` 50 + 51 +### 4. Дождевая вода для сада 52 + 53 +На крышу площадью `S` квадратных метров выпал дождь толщиной `R` миллиметров. В бочку удаётся собрать `P` процентов всей воды. Сколько литров попадёт в бочку? Известно, что 1 миллиметр дождя на площади 1 м² даёт 1 литр воды. Ответ по условию задачи всегда целый. 54 + 55 +**Входные данные:** три целых числа `S`, `R`, `P` (`1 ≤ S, R ≤ 1 000 000`; `0 ≤ P ≤ 100`). Гарантируется, что `S · R · P` делится на 100 и ответ не превышает `10^18`. 56 + 57 +**Выходные данные:** количество собранной воды в литрах. 58 + 59 +**Пример** 60 +```text 61 +Ввод: 80 12 75 62 +Вывод: 720 63 +``` 64 + 65 +--- 66 + 67 +## Уровень 2. Учитываем остаток и условия 68 + 69 +Здесь недостаточно просто перемножить величины. Нужно заметить неполную группу, порог, стоимость дополнительного шага или остаток материала. 70 + 71 +### 5. Места на открытой лекции 72 + 73 +В каждом ряду аудитории `C` мест. Организаторы открывают ровно столько рядов, чтобы рассадить `N` гостей. Сколько свободных мест останется в последнем открытом ряду? 74 + 75 +**Входные данные:** два целых числа `N` и `C` (`1 ≤ N, C ≤ 1 000 000 000`). 76 + 77 +**Выходные данные:** число свободных мест в последнем открытом ряду. 78 + 79 +**Пример** 80 +```text 81 +Ввод: 47 12 82 +Вывод: 1 83 +``` 84 + 85 +### 6. Покраска стены 86 + 87 +Стена имеет форму прямоугольника шириной `W` и высотой `H` метров. В стене есть дверь размером `D1 × D2` и окно размером `X1 × X2` метров. Их не красят. Один литр краски покрывает ровно `C` квадратных метров. Краска продаётся только целыми литрами, поэтому нужно купить достаточно, чтобы покрыть всю оставшуюся площадь. 88 + 89 +Найдите минимальное число литров краски. Проёмы не пересекаются, размеры отверстий не превышают размеры стены, а их площади в сумме меньше площади стены. 90 + 91 +**Входные данные:** семь целых чисел `W`, `H`, `D1`, `D2`, `X1`, `X2`, `C` (`1 ≤ W, H, C ≤ 1 000 000`; `1 ≤ D1, D2, X1, X2 ≤ 1 000 000`). 92 + 93 +**Выходные данные:** минимальное количество литров краски. 94 + 95 +**Пример** 96 +```text 97 +Ввод: 8 3 1 2 2 1 8 98 +Вывод: 3 99 +``` 100 + 101 +### 7. Пожертвование с поддержкой спонсора 102 + 103 +Для покупки оборудования нужно собрать `T` рублей. Сейчас собрано `M` рублей. Спонсор добавляет к каждому новому пожертвованию сумму, равную двум пожертвованным рублям: если участники пожертвовали `x` рублей, общая сумма увеличится на `3x`. Какую минимальную целую сумму `x` нужно собрать дополнительно? 104 + 105 +**Входные данные:** два целых числа `M` и `T` (`0 ≤ M, T ≤ 1 000 000 000 000`). 106 + 107 +**Выходные данные:** минимальную сумму пожертвований. Если цель уже достигнута, выведите `0`. 108 + 109 +**Пример** 110 +```text 111 +Ввод: 730 1000 112 +Вывод: 90 113 +``` 114 + 115 +### 8. Прокат автомобиля 116 + 117 +Первые 120 минут проката стоят `B` рублей. Если машина возвращена позже, за каждые начавшиеся дополнительные 60 минут нужно доплатить `R` рублей. Например, дополнительные 1 или 60 минут — это один оплачиваемый час, а 61 минута — уже два. Найдите стоимость проката, если машина была арендована на `T` минут. 118 + 119 +**Входные данные:** три целых числа `T`, `B`, `R` (`1 ≤ T ≤ 1 000 000 000`; `0 ≤ B, R ≤ 1 000 000`). 120 + 121 +**Выходные данные:** стоимость проката. 122 + 123 +**Пример** 124 +```text 125 +Ввод: 181 500 120 126 +Вывод: 740 127 +``` 128 + 129 +--- 130 + 131 +## Уровень 3. Находим закономерность и строим модель 132 + 133 +В этих задачах помогает рисунок, таблица маленьких примеров или разбор одного повторяющегося шага. После этого нужно вывести общее правило. 134 + 135 +### 9. Фонарики на фестивале 136 + 137 +На фестивале фонарики развешивают рядами. В первом ряду `A` фонариков. В каждом следующем ряду на `D` фонариков больше, чем в предыдущем. Всего рядов `N`. Сколько фонариков развесят? 138 + 139 +**Входные данные:** три целых числа `N`, `A`, `D` (`1 ≤ N ≤ 1 000 000 000`; `1 ≤ A, D ≤ 1 000 000 000`). Гарантируется, что итоговое число не превышает `10^18`. 140 + 141 +**Выходные данные:** общее число фонариков. 142 + 143 +**Пример** 144 +```text 145 +Ввод: 4 3 2 146 +Вывод: 24 147 +``` 148 + 149 +### 10. Панели для выставки 150 + 151 +На прямоугольной стене размером `W × H` сантиметров нужно разместить одинаковые панели размером `P × Q`. Поворачивать панели нельзя. От краёв стены нужно оставить поля шириной `M` сантиметров. Между соседними панелями должен быть зазор не менее `G` сантиметров. Панели располагают ровными рядами и столбцами. Какое максимальное число панелей поместится? 152 + 153 +**Входные данные:** шесть целых чисел `W`, `H`, `M`, `P`, `Q`, `G` (`1 ≤ W, H, P, Q ≤ 1 000 000`; `0 ≤ M, G ≤ 1 000 000`). 154 + 155 +**Выходные данные:** максимальное число панелей. 156 + 157 +**Пример** 158 +```text 159 +Ввод: 100 70 5 20 15 5 160 +Вывод: 9 161 +``` 162 + 163 +### 11. Огород у стены 164 + 165 +Прямоугольный огород одной стороной примыкает к длинной стене. Забор нужен только для трёх остальных сторон. Две стороны длиной `x` идут перпендикулярно стене, третья сторона длиной `y` — вдоль неё. Всего есть `L` метров забора. `x` и `y` должны быть целыми положительными числами, забора можно использовать не больше `L` метров. Найдите максимальную возможную площадь огорода. 166 + 167 +**Входные данные:** целое число `L` (`3 ≤ L ≤ 1 000 000 000`). 168 + 169 +**Выходные данные:** максимальная площадь. 170 + 171 +**Пример** 172 +```text 173 +Ввод: 10 174 +Вывод: 12 175 +``` 176 + 177 +### 12. Сложенный лист 178 + 179 +Толщина листа бумаги — `T` микрометров. Каждый сгиб ровно вдвое увеличивает толщину сложенной части. Найдите минимальное число сгибов, после которых толщина станет не меньше `H` микрометров. Если изначально толщина уже не меньше `H`, сгибы не нужны. 180 + 181 +**Входные данные:** два целых числа `T` и `H` (`1 ≤ T ≤ 1 000 000 000`; `1 ≤ H ≤ 1 000 000 000 000 000 000`). 182 + 183 +**Выходные данные:** минимальное число сгибов. 184 + 185 +**Пример** 186 +```text 187 +Ввод: 3 40 188 +Вывод: 4 189 +``` 190 + 191 +--- 192 + 193 +## Самопроверка после каждой задачи 194 + 195 +- Что означает каждая величина и в каких она единицах? 196 +- Где появляется неполная группа или остаток? 197 +- Какие части ситуации складываются, а какие повторяются одинаковое число раз? 198 +- Можно ли проверить модель на маленьком примере вручную? 199 +- Если ответ должен быть минимальным или максимальным, почему соседнее значение хуже? -
Показать разницуСкрыть разницу
1 +# Решения — уровень 1: переводим ситуацию в выражение 2 + 3 +## 1. Рассада для теплицы 4 + 5 +### Строим модель 6 + 7 +На одной грядке `P` кустов. Одинаковых грядок `B`, значит, количество кустов повторяется `B` раз: `B * P`. 8 + 9 +### Проверка 10 + 11 +Для 8 грядок по 17 кустов: `8 * 17 = 136`. 12 + 13 +### C++ 14 + 15 +```cpp 16 +#include <iostream> 17 +using namespace std; 18 + 19 +int main() { 20 + long long beds, plantsPerBed; 21 + cin >> beds >> plantsPerBed; 22 + 23 + cout << beds * plantsPerBed << '\n'; 24 + return 0; 25 +} 26 +``` 27 + 28 +--- 29 + 30 +## 2. Корм для приюта 31 + 32 +### Строим модель 33 + 34 +Сначала рассчитаем дневную норму для каждой группы: 35 + 36 +- взрослые собаки получают `A * G1` граммов; 37 +- щенки получают `K * G2` граммов. 38 + 39 +Дневная норма всего приюта — сумма этих количеств. На `D` дней понадобится дневная норма, повторённая `D` раз: 40 + 41 +`(A * G1 + K * G2) * D`. 42 + 43 +### Проверка 44 + 45 +Взрослым нужно `4 * 250 = 1000` г в день, щенкам — `3 * 120 = 360` г. Итого `1360` г в день; за 5 дней — `6800` г. 46 + 47 +### C++ 48 + 49 +```cpp 50 +#include <iostream> 51 +using namespace std; 52 + 53 +int main() { 54 + long long adults, puppies, foodForAdult, foodForPuppy, days; 55 + cin >> adults >> puppies >> foodForAdult >> foodForPuppy >> days; 56 + 57 + long long foodPerDay = adults * foodForAdult + puppies * foodForPuppy; 58 + cout << foodPerDay * days << '\n'; 59 + return 0; 60 +} 61 +``` 62 + 63 +--- 64 + 65 +## 3. Аквариум 66 + 67 +### Строим модель 68 + 69 +Вместимость в кубических сантиметрах равна объёму прямоугольного параллелепипеда: `L * W * H`. В одном литре 1000 см³, поэтому переводим объём в литры делением на 1000. 70 + 71 +### Проверка 72 + 73 +`50 * 20 * 30 = 30000` см³. Это `30000 / 1000 = 30` литров. 74 + 75 +### C++ 76 + 77 +```cpp 78 +#include <iostream> 79 +using namespace std; 80 + 81 +int main() { 82 + long long length, width, height; 83 + cin >> length >> width >> height; 84 + 85 + long long volumeCubicCm = length * width * height; 86 + cout << volumeCubicCm / 1000 << '\n'; 87 + return 0; 88 +} 89 +``` 90 + 91 +--- 92 + 93 +## 4. Дождевая вода для сада 94 + 95 +### Строим модель 96 + 97 +Каждый миллиметр дождя на каждом квадратном метре даёт один литр. Значит, без потерь на крышу выпадет `S * R` литров. Собирают `P` процентов от этого количества: 98 + 99 +`collected = S * R * P / 100`. 100 + 101 +По условию результат целый, поэтому целочисленного деления достаточно. 102 + 103 +### Проверка 104 + 105 +`80 * 12 = 960` литров выпало на крышу. 75% от 960 — `720` литров. 106 + 107 +### C++ 108 + 109 +```cpp 110 +#include <iostream> 111 +using namespace std; 112 + 113 +int main() { 114 + long long area, rain, percent; 115 + cin >> area >> rain >> percent; 116 + 117 + long long liters = area * rain * percent / 100; 118 + cout << liters << '\n'; 119 + return 0; 120 +} 121 +``` -
Показать разницуСкрыть разницу
1 +# Решения — уровень 2: учитываем остаток и условия 2 + 3 +## 5. Места на открытой лекции 4 + 5 +### Строим модель 6 + 7 +Полные ряды можно убрать из рассмотрения: в каждом из них свободных мест нет. Остаток `N % C` показывает, сколько гостей сидит в последнем ряду. 8 + 9 +- Если остаток равен 0, последний ряд заполнен целиком, свободных мест 0. 10 +- Если остаток не равен 0, свободно `C - остаток` мест. 11 + 12 +### Проверка 13 + 14 +`47 = 3 * 12 + 11`: три ряда заполнены полностью, в последнем сидят 11 гостей из 12. Остаётся одно место. 15 + 16 +### C++ 17 + 18 +```cpp 19 +#include <iostream> 20 +using namespace std; 21 + 22 +int main() { 23 + long long guests, seatsPerRow; 24 + cin >> guests >> seatsPerRow; 25 + 26 + long long remainder = guests % seatsPerRow; 27 + long long emptySeats = (remainder == 0) ? 0 : seatsPerRow - remainder; 28 + 29 + cout << emptySeats << '\n'; 30 + return 0; 31 +} 32 +``` 33 + 34 +--- 35 + 36 +## 6. Покраска стены 37 + 38 +### Строим модель 39 + 40 +Площадь стены — `W * H`. Дверь занимает `D1 * D2`, окно — `X1 * X2`. Вычитаем непокрашиваемые площади: 41 + 42 +`paintArea = W * H - D1 * D2 - X1 * X2`. 43 + 44 +Если одного литра хватает на `C` квадратных метров, для `paintArea` нужно `paintArea / C` литров. Но краска продаётся целыми литрами, поэтому дробную часть нужно округлить вверх. Для положительного числителя и знаменателя целочисленное округление вверх можно получить так: 45 + 46 +`paintArea / C + (paintArea % C != 0)`. 47 + 48 +### Проверка 49 + 50 +Площадь стены — 24 м², проёмы занимают `2 + 2 = 4` м². Красят 20 м². Двух литров хватит на 16 м², поэтому нужен третий литр. 51 + 52 +### C++ 53 + 54 +```cpp 55 +#include <iostream> 56 +using namespace std; 57 + 58 +int main() { 59 + long long w, h, doorW, doorH, windowW, windowH, coverage; 60 + cin >> w >> h >> doorW >> doorH >> windowW >> windowH >> coverage; 61 + 62 + long long paintArea = w * h - doorW * doorH - windowW * windowH; 63 + long long liters = paintArea / coverage; 64 + if (paintArea % coverage != 0) { 65 + ++liters; 66 + } 67 + 68 + cout << liters << '\n'; 69 + return 0; 70 +} 71 +``` 72 + 73 +--- 74 + 75 +## 7. Пожертвование с поддержкой спонсора 76 + 77 +### Строим модель 78 + 79 +Каждый пожертвованный рубль увеличивает общий сбор на 3 рубля: 1 рубль от участника и 2 рубля от спонсора. Если до цели не хватает `need = T - M`, нужно минимальное целое `x`, для которого `3x ≥ need`. 80 + 81 +Если цель уже достигнута (`M ≥ T`), ответ 0. Иначе округляем `need / 3` вверх. В целых числах это `need / 3` плюс один, если есть остаток. 82 + 83 +### Проверка 84 + 85 +До цели не хватает `1000 - 730 = 270` рублей. Каждые 3 рубля сбора получаются с одного пожертвованного рубля, значит, достаточно `270 / 3 = 90` рублей. 86 + 87 +### C++ 88 + 89 +```cpp 90 +#include <iostream> 91 +using namespace std; 92 + 93 +int main() { 94 + long long collected, target; 95 + cin >> collected >> target; 96 + 97 + long long donation = 0; 98 + if (collected < target) { 99 + long long need = target - collected; 100 + donation = need / 3; 101 + if (need % 3 != 0) { 102 + ++donation; 103 + } 104 + } 105 + 106 + cout << donation << '\n'; 107 + return 0; 108 +} 109 +``` 110 + 111 +--- 112 + 113 +## 8. Прокат автомобиля 114 + 115 +### Строим модель 116 + 117 +Первые 120 минут включены в базовую стоимость. Если прокат длился дольше, считаем лишние минуты `extra = T - 120`. 118 + 119 +Каждый начатый дополнительный час тарифицируется целиком. Поэтому число платных часов равно целой части `extra / 60` плюс один, если после деления есть остаток. Итоговая стоимость — базовая стоимость плюс цена всех дополнительных часов. 120 + 121 +### Проверка 122 + 123 +При 181 минуте после первых 120 остаётся 61 минута. Это два начатых часа: `60 + 120 * 2 = 240`. Вместе с базовыми 500 рублями получается 740 рублей. 124 + 125 +### C++ 126 + 127 +```cpp 128 +#include <iostream> 129 +using namespace std; 130 + 131 +int main() { 132 + long long minutes, basePrice, hourlyPrice; 133 + cin >> minutes >> basePrice >> hourlyPrice; 134 + 135 + long long cost = basePrice; 136 + if (minutes > 120) { 137 + long long extraMinutes = minutes - 120; 138 + long long paidHours = extraMinutes / 60; 139 + if (extraMinutes % 60 != 0) { 140 + ++paidHours; 141 + } 142 + cost += paidHours * hourlyPrice; 143 + } 144 + 145 + cout << cost << '\n'; 146 + return 0; 147 +} 148 +``` -
Показать разницуСкрыть разницу
1 +# Решения — уровень 3: находим закономерность и строим модель 2 + 3 +## 9. Фонарики на фестивале 4 + 5 +### Строим модель 6 + 7 +Число фонариков в последнем ряду равно `A + (N - 1) * D`: от первого до последнего ряда ровно `N - 1` переходов, каждый добавляет `D` фонариков. 8 + 9 +Получаем арифметическую последовательность от первого ряда `A` до последнего ряда `last`. Сумма равна числу рядов, умноженному на среднее первого и последнего: 10 + 11 +`sum = N * (A + last) / 2`. 12 + 13 +Чтобы не потерять точность целочисленного деления, сначала делим на 2 тот множитель, который гарантированно чётный: если `N` чётно — делим `N`, иначе `A + last` чётно. 14 + 15 +### Проверка 16 + 17 +Ряды содержат 3, 5, 7 и 9 фонариков. Сумма: `3 + 5 + 7 + 9 = 24`. 18 + 19 +### C++ 20 + 21 +```cpp 22 +#include <iostream> 23 +using namespace std; 24 + 25 +int main() { 26 + long long n, first, difference; 27 + cin >> n >> first >> difference; 28 + 29 + long long last = first + (n - 1) * difference; 30 + long long total; 31 + 32 + if (n % 2 == 0) { 33 + total = (n / 2) * (first + last); 34 + } else { 35 + total = n * ((first + last) / 2); 36 + } 37 + 38 + cout << total << '\n'; 39 + return 0; 40 +} 41 +``` 42 + 43 +--- 44 + 45 +## 10. Панели для выставки 46 + 47 +### Строим модель 48 + 49 +Сначала убираем поля по краям: полезная ширина равна `W - 2M`, полезная высота — `H - 2M`. 50 + 51 +Рассмотрим одно направление. Чтобы поставить `k` панелей шириной `P`, нужно место для панелей и промежутков между ними: 52 + 53 +`k * P + (k - 1) * G ≤ available`. 54 + 55 +Перегруппируем: 56 + 57 +`k * (P + G) ≤ available + G`. 58 + 59 +Значит, максимальное число панелей в этом направлении — целая часть `(available + G) / (P + G)`. Если доступное место меньше размера одной панели, в этом направлении помещается 0. 60 + 61 +Вычисляем число панелей по ширине и высоте и перемножаем. Поворот запрещён, поэтому размеры панели не меняем местами. 62 + 63 +### Проверка 64 + 65 +После полей остаётся `90 × 60` см. По ширине помещается `(90 + 5) / (20 + 5) = 3` панели, по высоте — `(60 + 5) / (15 + 5) = 3`. Всего `3 * 3 = 9`. 66 + 67 +### C++ 68 + 69 +```cpp 70 +#include <iostream> 71 +using namespace std; 72 + 73 +long long fit(long long available, long long panel, long long gap) { 74 + if (available < panel) { 75 + return 0; 76 + } 77 + return (available + gap) / (panel + gap); 78 +} 79 + 80 +int main() { 81 + long long w, h, margin, panelW, panelH, gap; 82 + cin >> w >> h >> margin >> panelW >> panelH >> gap; 83 + 84 + long long insideW = w - 2 * margin; 85 + long long insideH = h - 2 * margin; 86 + 87 + long long columns = fit(insideW, panelW, gap); 88 + long long rows = fit(insideH, panelH, gap); 89 + 90 + cout << columns * rows << '\n'; 91 + return 0; 92 +} 93 +``` 94 + 95 +--- 96 + 97 +## 11. Огород у стены 98 + 99 +### Строим модель 100 + 101 +Для выбранной ширины `x` две стороны забора используют `2x` метров. Оставшиеся метры можно отдать третьей стороне: `y = L - 2x`. Поскольку площадь при фиксированном `x` растёт вместе с `y`, выгодно использовать весь доступный остаток. 102 + 103 +Тогда площадь: 104 + 105 +`area = x * (L - 2x)`. 106 + 107 +Раскроем зависимость или посмотрим на параболу: это выражение достигает максимума около `x = L / 4`. Но `x` должен быть целым, поэтому достаточно проверить целые значения по обе стороны от `L / 4`: `floor(L / 4)` и `floor(L / 4) + 1`. Также проверяем, что `x ≥ 1` и для стороны вдоль стены остаётся хотя бы 1 метр (`2x < L`). 108 + 109 +### Проверка 110 + 111 +При `L = 10` можно взять `x = 2`, `y = 6`, площадь 12; либо `x = 3`, `y = 4`, тоже площадь 12. Большей площади получить нельзя. 112 + 113 +### C++ 114 + 115 +```cpp 116 +#include <algorithm> 117 +#include <iostream> 118 +using namespace std; 119 + 120 +int main() { 121 + long long fence; 122 + cin >> fence; 123 + 124 + long long candidate = max(1LL, fence / 4); 125 + long long bestArea = 0; 126 + 127 + for (long long x = candidate; x <= candidate + 1; ++x) { 128 + if (2 * x < fence) { 129 + long long y = fence - 2 * x; 130 + bestArea = max(bestArea, x * y); 131 + } 132 + } 133 + 134 + cout << bestArea << '\n'; 135 + return 0; 136 +} 137 +``` 138 + 139 +--- 140 + 141 +## 12. Сложенный лист 142 + 143 +### Строим модель 144 + 145 +Каждый сгиб удваивает толщину. После одного сгиба она равна `2T`, после двух — `4T`, после трёх — `8T`. После `k` сгибов толщина будет `T * 2^k`. 146 + 147 +Нужно найти минимальное `k`, для которого толщина стала не меньше `H`. Удобно начать с исходной толщины и выполнять сгибы, пока порог не достигнут. Каждый сгиб увеличивает счётчик на 1. 148 + 149 +При заданных ограничениях даже удвоение значения, меньшего `H`, остаётся не больше `2H`, а `H ≤ 10^18`, поэтому тип `long long` безопасен. 150 + 151 +### Проверка 152 + 153 +`3 → 6 → 12 → 24 → 48`. Порог 40 достигнут после четырёх сгибов. 154 + 155 +### C++ 156 + 157 +```cpp 158 +#include <iostream> 159 +using namespace std; 160 + 161 +int main() { 162 + long long thickness, target; 163 + cin >> thickness >> target; 164 + 165 + int folds = 0; 166 + while (thickness < target) { 167 + thickness *= 2; 168 + ++folds; 169 + } 170 + 171 + cout << folds << '\n'; 172 + return 0; 173 +} 174 +``` 175 + 176 +--- 177 + 178 +## Что важно заметить 179 + 180 +В задачах этого уровня формула не всегда сразу дана словами. Её можно получить через несколько примеров, закономерность, ограничение на число объектов или перебор небольшой окрестности математического максимума. Сначала обоснуй, почему модель верна, и только потом переноси её в код. -
Показать разницуСкрыть разницу
1 +# Решения 2 + 3 +Разборы задач по уровням: 4 + 5 +- **01. Уровень 1.md** — задачи 1–4: зависимости между величинами и единицы измерения. 6 +- **02. Уровень 2.md** — задачи 5–8: остаток, округление и условия. 7 +- **03. Уровень 3.md** — задачи 9–12: последовательности, размещение и оптимизация. 8 + 9 +Для каждой задачи приведены математическая модель, проверка примера и программа на C++.