JustCaptain kod-buduschego

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

Слито JustCaptain слил(а) topic-1.4-loops → main · e44b3dc
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 +```