Тема 1.4. Циклы и перебор вариантов: материал, задачи LMS, практика, необязательные задачи #10
4 файла изменено
+993
Войди, чтобы оставлять замечания к строкам.
Показать разницуСкрыть разницу
| @@ -0,0 +1,147 @@ | |||
| 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;`. | ||
Показать разницуСкрыть разницу
| @@ -0,0 +1,111 @@ | |||
| 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. | ||
Показать разницуСкрыть разницу
| @@ -0,0 +1,335 @@ | |||
| 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, а при повторении максимума — увеличивается. | ||
Показать разницуСкрыть разницу
| @@ -0,0 +1,400 @@ | |||
| 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 | +``` | ||