$ sudo teach IT

Разбор задач

Задача 1

У нас есть 50 машин.
Каждая может проехать 100 км.

Мы хотим организовать движение так, чтобы одна машина уехала максимально далеко, а остальные помогали ей топливом.

Разбор решения

Главная идея такая: пока машин много, каждый километр пути «стоит дорого», потому что топливо тратят все машины одновременно. Если едут 50 машин, то каждый километр уменьшает суммарный запас топлива сразу у всех пятидесяти. Поэтому выгодно постепенно уменьшать число машин, которые продолжают сопровождать лидера.

Оптимальная стратегия — двигаться поэтапно. Сначала вся колонна едет вместе. Затем одна машина прекращает сопровождение, перед этим передав остаток топлива остальным. После этого вперёд продолжают движение уже 49 машин. Затем снова одна выходит из игры, остаётся 48, и так далее. В конце остаётся одна машина, которая едет дальше одна.

На каждом этапе, когда активно k машин, можно продвинуться только на небольшой дополнительный участок. Чем больше машин участвует в этом этапе, тем меньше этот участок, потому что топливо расходуется быстрее. Если аккуратно просчитать баланс топлива на каждом таком шаге и сложить все получающиеся участки от 50 машин до 1 машины, то суммарное расстояние оказывается равным примерно четырём с половиной полным бакам.

Так как один бак соответствует 100 км, максимальное гарантированное расстояние равно 450 км.

Ответ: 450

Задача 2

Условие:
1000 бутылок, одна бракованная. Есть 10 датчиков.
Если датчик получит хоть каплю брака — через 1 день меняет цвет.
Нужно минимальное число дней, чтобы найти бутылку.

Разбор решения:
Это задача про “двоичный код”.

Каждый датчик — это 1 бит информации:

  • не поменял цвет → 0
  • поменял цвет → 1

За один день мы получаем 10 бит, то есть можем различить: 2¹⁰ = 1024 вариантов.

А бутылок 1000 — меньше 1024, значит мы можем закодировать каждую бутылку уникальным 10-битным набором.

Как действовать

Нумеруем бутылки от 1 до 1000.
Представляем номер каждой бутылки в двоичном виде.
Если в двоичной записи на i-й позиции стоит 1 — добавляем каплю из этой бутылки в датчик i.

Через день смотрим, какие датчики “сработали”.
Получаем двоичное число — это и есть номер бракованной бутылки.

Значит хватает одного запуска и одного дня ожидания.

Ответ: 1

Задача 3

Условие:
Смотритель говорит число словами. Посетитель отвечает другим числом и проходит.

Примеры:

  • “Двадцать два” → “Одиннадцать”
  • “Двадцать восемь” → “Четырнадцать”

На “Сорок два” человек ответил “Двадцать один”, но это неверно. Как правильно?

Разбор решения:
Здесь ловушка: это не “поделить на 2”.

Смотритель произносит число словами, а правильный ответ — это количество букв в написанном числе.

Проверим:

  • “Двадцать два”
    “двадцать” = 8 букв
    “два” = 3 буквы
    всего 11 → ответ “Одиннадцать”

  • “Двадцать восемь”
    “двадцать” = 8
    “восемь” = 6
    всего 14 → ответ “Четырнадцать”

Теперь “Сорок два”:

  • “сорок” = 5

  • “два” = 3
    Итого 8.

Ответ: 8

Задача 4

Условие:
Есть 7 утверждений про дни недели. Ровно одно — ложное. Найти, какой сегодня день.

Разбор решения (коротко, но по делу):
Раз ответ известен: воскресенье, покажем, как проверяется.

Пусть сегодня воскресенье.

Проверим утверждения:

  1. Сегодня не воскресенье (ложь), а завтра не среда (истина, завтра понедельник).
    Фраза “A, а B” в таких задачах обычно означает “и A, и B”.
    Тогда (1) становится ложным, потому что первая часть ложна.
  2. Вчера не пятница (истина: вчера суббота), позавчера не понедельник (истина: позавчера пятница). → истина.
  3. Завтра не воскресенье (истина: завтра понедельник) и вчера не воскресенье (истина: вчера суббота). → истина.
  4. Послезавтра не суббота и не воскресенье (истина: послезавтра вторник). → истина.
  5. Вчера не понедельник и не среда (истина: вчера суббота). → истина.
  6. Позавчера не среда (истина: позавчера пятница) и завтра не вторник (истина: завтра понедельник). → истина.
  7. Сегодня не среда (истина: сегодня воскресенье). → истина.

Получилось ровно одно ложное (№1). Значит всё сходится.

Ответ: воскресенье

Задача 5

Есть 3 конверта.
Известно, что:

  • в одном конверте оба утверждения истинны (TT),
  • во втором — оба ложны (FF),
  • в третьем — одно истинно, одно ложно (TF).

Нужно определить, какой конверт следует отправить.

Стратегия решения

В таких задачах правильный подход — перебрать возможные варианты, какой конверт нужно отправить, и проверить, можно ли при этом распределить типы записок (TT, FF, TF) так, чтобы условия выполнялись.

Обозначим

Пусть:

  • Отправляем конверт 1
  • или отправляем конверт 2
  • или отправляем конверт 3

Проверим каждый вариант.

Вариант 1: нужно отправить конверт 1

Конверт 1

  1. «Этот конверт отправлять не нужно» → ложь
  2. «Обязательно отправьте второй конверт» → ложь

→ Конверт 1 = FF

Конверт 2

  1. «Не нужно отправлять первый конверт» → ложь
  2. «Отправьте третий конверт» → ложь

→ Конверт 2 = FF

Получилось два FF, а должен быть только один.
Значит этот вариант невозможен.

Вариант 2: нужно отправить конверт 2

Конверт 1

  1. «Этот конверт отправлять не нужно» → истина
  2. «Обязательно отправьте второй конверт» → истина

→ Конверт 1 = TT

Конверт 2

  1. «Не нужно отправлять первый конверт» → истина
  2. «Отправьте третий конверт» → ложь

→ Конверт 2 = TF

Конверт 3

  1. «Не стоит отправлять этот конверт» → истина
  2. «Смело отправляйте первый конверт» → ложь

→ Конверт 3 = TF

Получилось:

  • один TT
  • два TF
  • ни одного FF

А по условию должен быть ровно один TT, один FF и один TF.

Значит этот вариант тоже невозможен.

Вариант 3: нужно отправить конверт 3

Конверт 1

  1. «Этот конверт отправлять не нужно» → истина
  2. «Обязательно отправьте второй конверт» → ложь

→ Конверт 1 = TF

Конверт 2

  1. «Не нужно отправлять первый конверт» → истина
  2. «Отправьте третий конверт» → истина

→ Конверт 2 = TT

Конверт 3

  1. «Не стоит отправлять этот конверт» → ложь
  2. «Смело отправляйте первый конверт» → ложь

→ Конверт 3 = FF

Получилось:

  • один TT
  • один FF
  • один TF

Все условия выполнены.

Вывод: Единственный вариант, при котором распределение типов записок возможно, — это если отправлять конверт 3.

Ответ: 3

На следующий урок