JustCaptain kod-buduschego

Тема 1.4: циклы и перебор вариантов — материал, задачи LMS, практика и необязательные задачи

JustCaptain · 1 неделю назад 6fd6c9a4bbd30b9f79d65f8e226e9c0fdc4255ba
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 +'''