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