Тема 1.4: циклы и перебор вариантов — материал, задачи LMS, практика и необязательные задачи
Родитель:
0c215d6
· сравнить с родителем
4 файла
-
Показать разницуСкрыть разницу
1 +# ⭐ Необязательные задачи 2 + 3 +> Дополнительная тренировка по теме. Решайте, если обязательные задачи уже сданы. 4 + 5 +--- 6 + 7 +## Задача 1. Сумма цифр числа 8 + 9 +### Условие 10 + 11 +Дано натуральное число. Найдите сумму его цифр. 12 + 13 +### Входные данные 14 + 15 +Одно натуральное число. 16 + 17 +### Выходные данные 18 + 19 +Одно число — сумма цифр. 20 + 21 +### Примеры 22 + 23 +| Ввод | Вывод | 24 +|---|---| 25 +| `1234` | `10` | 26 +| `7` | `7` | 27 +| `1000` | `1` | 28 + 29 +> [!NOTE] 30 +> Последняя цифра числа — это `n % 10`, а чтобы отбросить её, нужно `n /= 10`. Повторяйте, пока число больше нуля. 31 + 32 +--- 33 + 34 +## Задача 2. Второй максимум 35 + 36 +### Условие 37 + 38 +Дана последовательность из `N` целых чисел. Найдите наибольшее число, которое **строго меньше** максимума последовательности. 39 + 40 +Гарантируется, что в последовательности есть хотя бы два различных числа. 41 + 42 +### Входные данные 43 + 44 +В первой строке вводится число `N`. Во второй строке вводятся `N` целых чисел. 45 + 46 +### Выходные данные 47 + 48 +Второй по величине результат. 49 + 50 +### Примеры 51 + 52 +| Ввод | Вывод | 53 +|---|---| 54 +| `5`<br>`3 9 4 9 7` | `7` | 55 +| `4`<br>`-5 -1 -9 -3` | `-3` | 56 + 57 +> [!NOTE] 58 +> В первом примере максимум равен 9, а наибольшее число, меньшее 9, — это 7. Во втором примере все числа отрицательные: максимум −1, второй максимум −3. 59 + 60 +--- 61 + 62 +## Задача 3. Ёлочки 63 + 64 +### Условие 65 + 66 +Тимофей рисует ёлочки по клеточкам. Красота ёлки равна количеству ветвей с одной стороны ствола и длине самой нижней ветви. Каждая следующая верхняя ветка на одну клетку короче предыдущей. Между ветвями, а также под самой нижней и над самой верхней ветвями находится ствол дерева шириной ровно в одну клетку. 67 + 68 +Определите площадь ёлки заданной красоты. 69 + 70 +### Входные данные 71 + 72 +Одно целое число `n` — красота ёлки (`0 ≤ n ≤ 2·10⁹`). 73 + 74 +### Выходные данные 75 + 76 +Одно целое число — площадь ёлки красоты `n`. 77 + 78 +### Примеры 79 + 80 +| Ввод | Вывод | 81 +|---|---| 82 +| `1` | `5` | 83 +| `2` | `11` | 84 + 85 +> [!TIP] 86 +> Ёлка красоты `n` состоит из `2n` ветвей длины `1, 2, ..., n` и ствола длины `2n + 1`. Сумму `1 + 2 + ... + n` считайте формулой `n * (n + 1) / 2`, а не циклом: при `n` до 2·10⁹ цикл не уложится в лимит времени. Не забудьте про `long long`. 87 + 88 +--- 89 + 90 +## Задача 4. Сумма до нуля 91 + 92 +### Условие 93 + 94 +Вводится последовательность целых чисел, которая заканчивается числом 0 (сам ноль в последовательность не входит). Найдите сумму всех чисел последовательности. 95 + 96 +### Входные данные 97 + 98 +Последовательность целых чисел, завершающаяся числом 0. 99 + 100 +### Выходные данные 101 + 102 +Одно число — сумма чисел последовательности. 103 + 104 +### Примеры 105 + 106 +| Ввод | Вывод | 107 +|---|---| 108 +| `4 7 2 0` | `13` | 109 +| `0` | `0` | 110 + 111 +> [!NOTE] 112 +> Количество чисел заранее неизвестно, поэтому используйте `while (cin >> x && x != 0)`. Если последовательность пустая (сразу ноль), сумма равна 0. 113 + 114 +--- 115 + 116 +## Задача 5. Таблица умножения 117 + 118 +### Условие 119 + 120 +По данному числу `N` выведите таблицу умножения размером `N × N`: в строке `i` и столбце `j` стоит произведение `i * j`. 121 + 122 +### Входные данные 123 + 124 +Одно натуральное число `N`. 125 + 126 +### Выходные данные 127 + 128 +`N` строк по `N` чисел, разделённых пробелами. 129 + 130 +### Пример 131 + 132 +**Ввод:** 133 + 134 +'''text 135 +3 136 +''' 137 + 138 +**Вывод:** 139 + 140 +'''text 141 +1 2 3 142 +2 4 6 143 +3 6 9 144 +''' 145 + 146 +> [!NOTE] 147 +> Здесь нужны вложенные циклы: внешний отвечает за строки, внутренний — за столбцы. После внутреннего цикла не забудьте `cout << endl;`. -
Показать разницуСкрыть разницу
1 +# ✅ Обязательные задачи (LMS) 2 + 3 +> Эти задачи нужно решить и сдать в LMS. 4 + 5 +--- 6 + 7 +## Задача 1. Подготовка Юры 8 + 9 +### Условие 10 + 11 +Юра решил подготовиться к региональной олимпиаде по информатике. Он выбрал на сайте `N` задач, чтобы решить их на каникулах. В первый день Юра решил `K` задач, а в каждый следующий день Юра решал на одну задачу больше, чем в предыдущий день. 12 + 13 +Определите, сколько дней уйдёт у Юры на подготовку к олимпиаде. 14 + 15 +### Входные данные 16 + 17 +Два целых положительных числа `N` и `K`, записанных в отдельных строках — количество задач и количество задач, решённых в первый день. 18 + 19 +### Выходные данные 20 + 21 +Одно число — количество дней. 22 + 23 +### Примеры 24 + 25 +**Ввод:** 26 + 27 +'''text 28 +10 29 +3 30 +''' 31 + 32 +**Вывод:** 33 + 34 +'''text 35 +3 36 +''' 37 + 38 +**Ввод:** 39 + 40 +'''text 41 +5 42 +5 43 +''' 44 + 45 +**Вывод:** 46 + 47 +'''text 48 +1 49 +''' 50 + 51 +> [!NOTE] 52 +> В первом примере Юра решает 3, потом 4, потом 5 задач: 3 + 4 + 5 = 12 ≥ 10, значит, хватит трёх дней. Во втором примере уже в первый день решено 5 задач из 5 — нужен один день. 53 + 54 +--- 55 + 56 +## Задача 2. Палиндром 57 + 58 +### Условие 59 + 60 +Натуральное число называется **палиндромом**, если его запись в десятичной системе счисления одинаково читается как слева направо, так и справа налево. 61 + 62 +По данному натуральному числу `N` определите следующее за ним натуральное число (то есть наименьшее число, которое превосходит `N`), являющееся палиндромом. 63 + 64 +### Входные данные 65 + 66 +Одно натуральное число `N`. 67 + 68 +### Выходные данные 69 + 70 +Наименьшее натуральное число, которое больше `N` и является палиндромом. 71 + 72 +### Примеры 73 + 74 +**Ввод:** 75 + 76 +'''text 77 +123 78 +''' 79 + 80 +**Вывод:** 81 + 82 +'''text 83 +131 84 +''' 85 + 86 +**Ввод:** 87 + 88 +'''text 89 +9 90 +''' 91 + 92 +**Вывод:** 93 + 94 +'''text 95 +11 96 +''' 97 + 98 +**Ввод:** 99 + 100 +'''text 101 +99 102 +''' 103 + 104 +**Вывод:** 105 + 106 +'''text 107 +101 108 +''' 109 + 110 +> [!NOTE] 111 +> Числа 124, 125, ..., 130 палиндромами не являются, а 131 читается одинаково в обе стороны. После однозначного числа 9 идёт двузначное 11, после 99 — трёхзначное 101. -
Показать разницуСкрыть разницу
1 +# 🧑🏫 Практика 2 + 3 +> Задачи, которые решаем на занятиях. 4 + 5 +--- 6 + 7 +## Задача 1. Сумма положительных чисел 8 + 9 +### Условие 10 + 11 +Дана последовательность из `n` целых чисел. Найдите сумму всех положительных чисел этой последовательности. 12 + 13 +### Входные данные 14 + 15 +В первой строке записано целое число `n` — количество чисел в последовательности. Во второй строке записаны `n` целых чисел. 16 + 17 +### Выходные данные 18 + 19 +Одно число — сумма всех положительных элементов последовательности. 20 + 21 +### Пример 22 + 23 +**Ввод:** 24 + 25 +'''text 26 +6 27 +4 -3 8 0 -2 5 28 +''' 29 + 30 +**Вывод:** 31 + 32 +'''text 33 +17 34 +''' 35 + 36 +> [!NOTE] 37 +> Положительные числа: 4, 8 и 5. Их сумма: 4 + 8 + 5 = 17. Ноль не добавляется, потому что условие `x > 0` для него ложно. 38 + 39 +--- 40 + 41 +## Задача 2. Первая высокая башня 42 + 43 +### Условие 44 + 45 +Вдоль дороги расположены `N` башен. Необходимо определить номер первой башни, высота которой не меньше `H` метров. 46 + 47 +### Входные данные 48 + 49 +В первой строке вводятся числа `N` и `H`. Во второй строке вводятся `N` целых чисел — высоты башен. 50 + 51 +### Выходные данные 52 + 53 +Номер первой подходящей башни. Если такой башни нет, выведите `0`. 54 + 55 +### Примеры 56 + 57 +**Ввод:** 58 + 59 +'''text 60 +6 30 61 +12 18 27 35 31 28 62 +''' 63 + 64 +**Вывод:** 65 + 66 +'''text 67 +4 68 +''' 69 + 70 +**Ввод:** 71 + 72 +'''text 73 +3 100 74 +10 20 30 75 +''' 76 + 77 +**Вывод:** 78 + 79 +'''text 80 +0 81 +''' 82 + 83 +> [!NOTE] 84 +> Номера башен считаются с единицы, а счётчик цикла начинается с нуля — поэтому при выводе нужно `i + 1`. 85 + 86 +--- 87 + 88 +## Задача 3. Чередование 89 + 90 +### Условие 91 + 92 +Дана последовательность из `N` чисел. Определите, чередуются ли в ней чётные и нечётные числа. 93 + 94 +### Входные данные 95 + 96 +В первой строке вводится число `N`. Во второй строке — `N` целых чисел. 97 + 98 +### Выходные данные 99 + 100 +`YES`, если последовательность чередуется, иначе `NO`. 101 + 102 +### Примеры 103 + 104 +**Ввод:** 105 + 106 +'''text 107 +5 108 +2 7 8 5 4 109 +''' 110 + 111 +**Вывод:** 112 + 113 +'''text 114 +YES 115 +''' 116 + 117 +**Ввод:** 118 + 119 +'''text 120 +4 121 +2 4 5 7 122 +''' 123 + 124 +**Вывод:** 125 + 126 +'''text 127 +NO 128 +''' 129 + 130 +> [!NOTE] 131 +> В первом примере чётность меняется на каждом шаге: чёт, нечёт, чёт, нечёт, чёт. Во втором примере числа 2 и 4 стоят подряд — чередование нарушено. 132 + 133 +--- 134 + 135 +## Задача 4. Лучший результат 136 + 137 +### Условие 138 + 139 +В соревновании участвовали `N` человек. Известны их результаты. Определите, сколько участников набрали максимальный результат. 140 + 141 +### Входные данные 142 + 143 +В первой строке вводится число `N`. Во второй строке вводятся `N` целых чисел. 144 + 145 +### Выходные данные 146 + 147 +Количество участников, показавших лучший результат. 148 + 149 +### Пример 150 + 151 +**Ввод:** 152 + 153 +'''text 154 +6 155 +98 87 98 91 75 98 156 +''' 157 + 158 +**Вывод:** 159 + 160 +'''text 161 +3 162 +''' 163 + 164 +> [!NOTE] 165 +> Лучший результат — 98 баллов, его показали три участника. 166 + 167 +--- 168 + 169 +## Задача 5. После максимума 170 + 171 +### Условие 172 + 173 +Дана последовательность из `N` целых чисел. Определите сумму всех элементов, расположенных после первого максимального элемента. 174 + 175 +### Входные данные 176 + 177 +В первой строке вводится число `N`. Во второй строке вводятся `N` чисел. 178 + 179 +### Выходные данные 180 + 181 +Сумма элементов после первого максимума. 182 + 183 +### Пример 184 + 185 +**Ввод:** 186 + 187 +'''text 188 +6 189 +5 9 2 4 8 1 190 +''' 191 + 192 +**Вывод:** 193 + 194 +'''text 195 +15 196 +''' 197 + 198 +> [!NOTE] 199 +> Первый максимум — 9. После него стоят 2, 4, 8 и 1: их сумма равна 15. Здесь нужны два прохода по данным, поэтому числа придётся сохранить в массив. 200 + 201 +--- 202 + 203 +## Задачи ОГЭ/ЕГЭ 204 + 205 +> Задачи из экзаменационных вариантов: последовательность до нуля, подсчёт по условию, максимум. 206 + 207 +--- 208 + 209 +## Задача 6. Сумма кратных чисел 210 + 211 +### Условие 212 + 213 +Дано натуральное число `N`. Найдите сумму всех натуральных чисел, не превосходящих `N`, которые делятся на 3. 214 + 215 +### Входные данные 216 + 217 +Одно натуральное число `N`. 218 + 219 +### Выходные данные 220 + 221 +Одно число — искомая сумма. 222 + 223 +### Пример 224 + 225 +**Ввод:** 226 + 227 +'''text 228 +10 229 +''' 230 + 231 +**Вывод:** 232 + 233 +'''text 234 +18 235 +''' 236 + 237 +> [!NOTE] 238 +> Подходящие числа: 3, 6, 9. Их сумма равна 18. Обратите внимание на границу цикла: `i <= n`, потому что `N` входит в диапазон. 239 + 240 +--- 241 + 242 +## Задача 7. Количество отличников 243 + 244 +### Условие 245 + 246 +Учитель ввёл оценки всех учеников класса. Необходимо определить, сколько учеников получили оценку 5. 247 + 248 +### Входные данные 249 + 250 +В первой строке вводится число `N`. Во второй строке вводятся `N` целых чисел (от 2 до 5). 251 + 252 +### Выходные данные 253 + 254 +Количество пятёрок. 255 + 256 +### Пример 257 + 258 +**Ввод:** 259 + 260 +'''text 261 +8 262 +5 4 5 3 5 2 4 5 263 +''' 264 + 265 +**Вывод:** 266 + 267 +'''text 268 +4 269 +''' 270 + 271 +--- 272 + 273 +## Задача 8. Максимальный элемент последовательности 274 + 275 +### Условие 276 + 277 +Последовательность натуральных чисел оканчивается числом 0, которое не входит в последовательность. Определите максимальный элемент последовательности. 278 + 279 +### Входные данные 280 + 281 +Последовательность натуральных чисел, завершающаяся числом 0. 282 + 283 +### Выходные данные 284 + 285 +Максимальное число последовательности. 286 + 287 +### Пример 288 + 289 +**Ввод:** 290 + 291 +'''text 292 +17 25 11 42 39 0 293 +''' 294 + 295 +**Вывод:** 296 + 297 +'''text 298 +42 299 +''' 300 + 301 +> [!NOTE] 302 +> Количество чисел заранее неизвестно, поэтому здесь удобен `while` с условием `cin >> x && x != 0`. 303 + 304 +--- 305 + 306 +## Задача 9. Количество максимальных элементов 307 + 308 +### Условие 309 + 310 +Последовательность натуральных чисел заканчивается числом 0, которое не входит в последовательность. Определите, сколько раз встречается максимальный элемент. 311 + 312 +### Входные данные 313 + 314 +Последовательность натуральных чисел, завершающаяся числом 0. 315 + 316 +### Выходные данные 317 + 318 +Количество максимальных элементов. 319 + 320 +### Пример 321 + 322 +**Ввод:** 323 + 324 +'''text 325 +5 8 3 6 8 2 0 326 +''' 327 + 328 +**Вывод:** 329 + 330 +'''text 331 +2 332 +''' 333 + 334 +> [!NOTE] 335 +> Максимум равен 8 и встречается дважды. Когда находится новый максимум, счётчик сбрасывается в 1, а при повторении максимума — увеличивается. -
Показать разницуСкрыть разницу
1 +# 📘 Тема 1.4. Необходимый материал 2 + 3 +> Шпаргалка по циклам и перебору вариантов. 4 + 5 +--- 6 + 7 +## 1. Что такое цикл 8 + 9 +**Цикл** — конструкция, которая повторяет один и тот же блок кода много раз: пока выполняется условие или для каждого элемента набора данных. 10 + 11 +Зачем нужны циклы: 12 + 13 +- **Меньше кода.** Вместо миллиона одинаковых строк — один цикл. 14 +- **Работа с последовательностями.** Сумма, максимум, подсчёт — всё это делается в цикле. 15 +- **Перебор вариантов.** Можно проверить все возможные пары, тройки, комбинации. 16 + 17 +Термины: 18 + 19 +| Термин | Значение | 20 +|---|---| 21 +| **итерация** | одно выполнение тела цикла | 22 +| **тело цикла** | блок кода, который повторяется | 23 +| **счётчик** | переменная, которая меняется на каждой итерации (`i`) | 24 +| **условие продолжения** | логическое выражение, которое проверяется перед итерацией | 25 + 26 +> [!NOTE] 27 +> В олимпиадных задачах цикл выполняется 10⁵–10⁶ раз — это нормально. А вот 10⁹ итераций программа будет считать секунды и не уложится в лимит времени. 28 + 29 +--- 30 + 31 +## 2. Цикл со счётчиком `for` 32 + 33 +Используется, когда **количество повторений известно**. 34 + 35 +'''cpp 36 +for (инициализация; условие; шаг) { 37 + // тело цикла 38 +} 39 +''' 40 + 41 +Порядок работы: 42 + 43 +1. **Инициализация** — выполняется один раз перед циклом. Здесь создаётся счётчик: `int i = 0`. 44 +2. **Условие** — проверяется перед каждой итерацией. Истинно — тело выполняется, ложно — цикл завершается. 45 +3. **Тело цикла** — то, что повторяется. 46 +4. **Шаг** — выполняется после каждой итерации. Обычно `i++`. 47 + 48 +'''cpp 49 +// числа от 1 до 5 50 +for (int i = 1; i <= 5; i++) { 51 + cout << i << " "; 52 +} 53 +cout << endl; // 1 2 3 4 5 54 +''' 55 + 56 +### Три частых варианта границ 57 + 58 +'''cpp 59 +// обход n элементов: i = 0, 1, ..., n - 1 — ровно n итераций 60 +for (int i = 0; i < n; i++) { ... } 61 + 62 +// числа от 1 до n включительно — тоже n итераций 63 +for (int i = 1; i <= n; i++) { ... } 64 + 65 +// обратный обход: n, n - 1, ..., 1 66 +for (int i = n; i >= 1; i--) { ... } 67 +''' 68 + 69 +> [!WARNING] 70 +> `i < n` и `i <= n` — это разное число итераций. Для `for (int i = 0; i < n; i++)` итераций ровно `n`, а для `for (int i = 0; i <= n; i++)` — уже `n + 1`. Это самая частая ошибка на олимпиадах. 71 + 72 +--- 73 + 74 +## 3. Цикл с пред-условием `while` 75 + 76 +Используется, когда **количество повторений заранее неизвестно**, но есть условие продолжения. 77 + 78 +'''cpp 79 +while (условие) { 80 + // тело цикла 81 +} 82 +''' 83 + 84 +Порядок работы: проверяется условие → если истинно, выполняется тело → условие проверяется снова → если ложно, цикл завершается. 85 + 86 +'''cpp 87 +// сумма чисел от 1 до n 88 +int s = 0; 89 +int i = 1; 90 +while (i <= n) { 91 + s += i; 92 + i++; 93 +} 94 +''' 95 + 96 +> [!CAUTION] 97 +> В `while` счётчик меняется **вручную** внутри тела цикла. Если забыть `i++`, условие никогда не станет ложным и программа зависнет — получится **бесконечный цикл**. 98 + 99 +--- 100 + 101 +## 4. Цикл с пост-условием `do-while` 102 + 103 +Похож на `while`, но условие проверяется **после** тела, поэтому тело выполняется хотя бы один раз. 104 + 105 +'''cpp 106 +do { 107 + // тело цикла 108 +} while (условие); 109 +''' 110 + 111 +'''cpp 112 +// сумма и количество чисел до первого нуля 113 +double sum = 0; 114 +int count = 0; 115 +double number; 116 + 117 +do { 118 + cin >> number; 119 + if (number != 0) { 120 + sum += number; 121 + count++; 122 + } 123 +} while (number != 0); 124 +''' 125 + 126 +> [!NOTE] 127 +> `do-while` нужен там, где действие должно произойти хотя бы раз: например, «запросить пароль, потом проверить». В олимпиадных задачах он встречается редко, чаще хватает `while`. 128 + 129 +--- 130 + 131 +## 5. Какой цикл выбрать 132 + 133 +| Цикл | Когда использовать | Особенность | 134 +|---|---|---| 135 +| `for` | известно количество повторений | счётчик создаётся и изменяется в заголовке | 136 +| `while` | количество повторений неизвестно, но есть условие | счётчик изменяется вручную | 137 +| `do-while` | тело должно выполниться хотя бы один раз | условие проверяется после тела | 138 + 139 +Правило выбора: 140 + 141 +- знаете, сколько раз повторять — `for`; 142 +- повторяете, пока что-то истинно — `while`; 143 +- нужно выполнить тело хотя бы раз — `do-while`. 144 + 145 +--- 146 + 147 +## 6. Вложенные циклы и полный перебор 148 + 149 +**Вложенный цикл** — цикл внутри цикла. Внешний цикл делает одну итерацию, а внутренний за это время полностью проходит все свои. 150 + 151 +'''cpp 152 +// таблица умножения 3 × 3 153 +for (int i = 1; i <= 3; i++) { 154 + for (int j = 1; j <= 3; j++) { 155 + cout << i * j << " "; 156 + } 157 + cout << endl; 158 +} 159 +''' 160 + 161 +'''text 162 +1 2 3 163 +2 4 6 164 +3 6 9 165 +''' 166 + 167 +**Полный перебор** — стратегия, при которой мы проверяем все возможные варианты и выбираем подходящий. Обычно реализуется вложенными циклами. 168 + 169 +'''cpp 170 +// все пары (i, j), такие что i + j = 5 171 +for (int i = 0; i <= 5; i++) { 172 + for (int j = 0; j <= 5; j++) { 173 + if (i + j == 5) { 174 + cout << i << " " << j << endl; 175 + } 176 + } 177 +} 178 +''' 179 + 180 +> [!WARNING] 181 +> Два вложенных цикла по `n` итераций дают `n²` операций — сложность **O(n²)**. Для `n = 1000` это миллион операций (быстро), а для `n = 100000` — уже 10¹⁰ (слишком долго). Если перебор не укладывается в лимит времени, ищите формулу или другой алгоритм. 182 + 183 +--- 184 + 185 +## 7. Шаблоны задач 186 + 187 +### Сумма 188 + 189 +'''cpp 190 +int sum = 0; 191 +for (int i = 0; i < n; i++) { 192 + int x; 193 + cin >> x; 194 + sum += x; 195 +} 196 +''' 197 + 198 +### Сумма с условием 199 + 200 +'''cpp 201 +int sum = 0; 202 +for (int i = 0; i < n; i++) { 203 + int x; 204 + cin >> x; 205 + if (x > 0) { // только положительные 206 + sum += x; 207 + } 208 +} 209 +''' 210 + 211 +### Подсчёт количества 212 + 213 +'''cpp 214 +int cnt = 0; 215 +for (int i = 0; i < n; i++) { 216 + int x; 217 + cin >> x; 218 + if (x == 5) { 219 + cnt++; 220 + } 221 +} 222 +''' 223 + 224 +### Максимум и минимум 225 + 226 +'''cpp 227 +int mx = -1000000000; // «минус бесконечность» 228 +int mn = 1000000000; // «плюс бесконечность» 229 + 230 +for (int i = 0; i < n; i++) { 231 + int x; 232 + cin >> x; 233 + if (x > mx) mx = x; 234 + if (x < mn) mn = x; 235 +} 236 +''' 237 + 238 +### Поиск первого подходящего 239 + 240 +'''cpp 241 +for (int i = 0; i < n; i++) { 242 + int x; 243 + cin >> x; 244 + if (x >= h) { 245 + cout << i + 1 << endl; // номер с единицы 246 + return 0; // нашли — выходим сразу 247 + } 248 +} 249 +cout << 0 << endl; // не нашли 250 +''' 251 + 252 +### Количество максимальных элементов 253 + 254 +'''cpp 255 +int mx = -1000000000; 256 +int cnt = 0; 257 + 258 +for (int i = 0; i < n; i++) { 259 + int x; 260 + cin >> x; 261 + if (x > mx) { 262 + mx = x; 263 + cnt = 1; // новый максимум встретился впервые 264 + } else if (x == mx) { 265 + cnt++; 266 + } 267 +} 268 +''' 269 + 270 +### Второй максимум 271 + 272 +'''cpp 273 +int mx1 = -1000000000; // максимум 274 +int mx2 = -1000000000; // наибольшее число, меньшее максимума 275 + 276 +for (int i = 0; i < n; i++) { 277 + int x; 278 + cin >> x; 279 + if (x > mx1) { 280 + mx2 = mx1; 281 + mx1 = x; 282 + } else if (x < mx1 && x > mx2) { 283 + mx2 = x; 284 + } 285 +} 286 +''' 287 + 288 +### Длина самой длинной серии 289 + 290 +'''cpp 291 +int current = 0, best = 0; 292 +for (int i = 0; i < n; i++) { 293 + int x; 294 + cin >> x; 295 + if (x > 0) { 296 + current++; 297 + if (current > best) best = current; 298 + } else { 299 + current = 0; 300 + } 301 +} 302 +''' 303 + 304 +> [!IMPORTANT] 305 +> Переменные `sum`, `cnt`, `mx`, `mn` обязательно инициализируются **до** цикла. Иначе там будет «мусор» и ответ окажется неверным. 306 + 307 +--- 308 + 309 +## 8. Последовательность, которая заканчивается нулём 310 + 311 +Если количество чисел заранее неизвестно, а последовательность завершается нулём (ноль в неё не входит), удобно писать так: 312 + 313 +'''cpp 314 +int x; 315 +while (cin >> x && x != 0) { 316 + // обработка x 317 +} 318 +''' 319 + 320 +Условие `cin >> x && x != 0` читается так: «считать число, и если оно не ноль — продолжить». Как только встречается `0`, цикл завершается. 321 + 322 +'''cpp 323 +// максимум последовательности до нуля 324 +int mx = -1000000000; 325 +int x; 326 +while (cin >> x && x != 0) { 327 + if (x > mx) mx = x; 328 +} 329 +cout << mx << endl; 330 +''' 331 + 332 +--- 333 + 334 +## 9. Формула вместо цикла 335 + 336 +Сумму арифметической прогрессии можно посчитать без цикла: 337 + 338 +'''text 339 +1 + 2 + 3 + ... + n = n * (n + 1) / 2 340 +''' 341 + 342 +'''cpp 343 +// циклом — n итераций 344 +int s = 0; 345 +for (int i = 1; i <= n; i++) { 346 + s += i; 347 +} 348 +''' 349 + 350 +'''cpp 351 +// формулой — одна операция 352 +long long s = (long long)n * (n + 1) / 2; 353 +''' 354 + 355 +Пример: задача «Ёлочки». Ёлка красоты `n` состоит из `2n` ветвей длины `1, 2, ..., n` и ствола длины `2n + 1`. Площадь равна `2 * (1 + 2 + ... + n) + 2n + 1`, то есть `n * (n + 1) + 2n + 1`. 356 + 357 +'''cpp 358 +long long n; 359 +cin >> n; 360 +cout << n * (n + 1) + 2 * n + 1 << endl; 361 +''' 362 + 363 +> [!TIP] 364 +> Если задачу можно решить формулой — решайте формулой. Цикл на 2·10⁹ итераций работает десятки секунд и не проходит по времени, а формула — мгновенно. 365 +> 366 +> И следите за типом: при `n` до 2·10⁹ произведение `n * (n + 1)` достигает 4·10¹⁸ и в `int` не помещается — нужен `long long`. 367 + 368 +--- 369 + 370 +## 10. Типичные ошибки 371 + 372 +| ❌ Неправильно | ✅ Правильно | 373 +|---|---| 374 +| `for (int i = 0; i <= n; i++)` для обхода `n` элементов | `for (int i = 0; i < n; i++)` | 375 +| `while (i <= n) { s += i; }` — забыли `i++` | добавить `i++` в тело цикла | 376 +| `int sum;` и сразу `sum += x;` | `int sum = 0;` до цикла | 377 +| `int mx = 0;` для максимума отрицательных чисел | `int mx = -1000000000;` или первый элемент | 378 +| `if (x > mx) mx = x;` для подсчёта максимумов | `if (x > mx) { mx = x; cnt = 1; } else if (x == mx) cnt++;` | 379 +| `int` для сумм и произведений больше 2·10⁹ | `long long` | 380 +| Цикл на 10⁹ итераций там, где есть формула | посчитать формулой | 381 +| Вывод подсказок вроде `Введите число:` | выводить только ответ | 382 + 383 +--- 384 + 385 +## 11. Шаблон программы 386 + 387 +'''cpp 388 +#include <iostream> 389 +using namespace std; 390 + 391 +int main() { 392 + // ввод данных 393 + 394 + // цикл: обработка последовательности 395 + 396 + // вывод ответа 397 + 398 + return 0; 399 +} 400 +'''