Самопроверка при решении задач
У меня ни школьные, ни институтские курсы математики никогда не вызывали особых проблем. Я даже участвовал в каких-то математических олимпиадах и даже, не поверите, занимал призовые места. Это сейчас я обленился и все забыл, но когда-то решение задачек и головоломок меня весьма увлекало. Однако у меня была и остается одна черта, раз за разом основательно портящая всю малину, — невнимательность.
Помню, как дважды досрочно (каково, а?) сдавал экзамен по дифурам. Оба раза я был идеально готов, и преподаватель об этом знал. И оба раза я сделал глупейшие, хотя и разные, ошибки и пришел к неправильным результатам. Если бы я сам у себя принимал экзамен, то ошибки эти заметил бы непременно, настолько они бросались в глаза! В результате получил «хорошо», и это было очень обидно, но правильно и справедливо.
Наверное, с того момента я и начал бороться сам с собой. В любой задаче я стал искать обходной путь, который позволил бы проверить правильность решения. Иногда обходной путь давал само искомое решение, иногда лишь какую-нибудь верхнюю границу или качественную характеристику, но даже это уже было большим подспорьем и помогало отсечь «совсем неправильные» ответы.
Приведу на тему самопроверки несколько поучительных примеров.
1. True story. Наверняка все уже слышали эту историю.
Был он [преподаватель математики] человеком крупным и покушать любил. В столовой однажды взял он два супа, два вторых… словом, обед в двух экземплярах. Подходит к кассе. Молоденькая кассирша щелк-щелк-щелк на счетах:«С вас 2-17», он в ответ «Неправильно». Кассирша снова за счеты: «2-05», он в ответ «Неправильно». Кассирша, окончательно смущенная и напуганная, — щелк-щелк-щелк — «1-97», а сей ученый муж ей в ответ: «Снова неправильно!» Отчаявшаяся кассирша: «А сколько должно быть?!» Он в ответ: «Не знаю. Но два одинаковых обеда — четное число!»
2. Взвешивание монет.
У нас есть 9 монет, 8 из которых имеют одинаковый вес, а вес одной (фальшивой) больше весов остальных. Также у нас есть равноплечные весы с чашами. Необходимо найти фальшивую монету за минимальное число взвешиваний.
При таком малом количестве монет найти правильное решение можно просто перебором, это вряд ли займет больше минуты. Взвешивая по 3 монеты на каждой чаше, мы найдем группу из 3 монет, вес которой больше веса каждой из двух других групп. Затем, взвешивая 2 из этих 3 монет, находим фальшивую. Итого 2 взвешивания.
Попробуем подойти с другого бока. Представим номер фальшивой монеты в двоичном виде. Очевидно, 3 бит недостаточно, в них можно закодировать только 8 номеров, а 4 — уже слишком много, в них можно закодировать целых 16. Точное значение количества требуемых битов выражается двоичным логарифмом: log29. Теперь заметим, что каждое взвешивание может иметь 3 возможных исхода: левая чаша тяжелее, правая чаша тяжелее, чаши в равновесии. Таким образом, результат взвешивания можно представить log23 битами. Теперь чтобы найти минимальное необходимое количество взвешиваний, нужно найти отношение количества неизвестных нам битов к количеству битов, получаемых за одно взвешивание, и округлить вверх: ceil(log29 / log23) = ceil(log2(9/3)) = ceil(log23) = 2.
Понятно, что для 9 монет все это имеет мало смыла в силу очевидности ответа, но что если монет не 9, а 999? Слабо найти минимальное число взвешиваний? Да легко: ceil(log2999 / log23) = ceil(log2333) = 9. И теперь, зная ответ, гораздо проще подобрать искомую последовательность взвешиваний.
3. Самые быстрые лошади.
В скачках участвует 25 лошадей. В каждом заезде может участвовать не более 5 лошадей. Результатом заезда является последовательность прохождения участниками финишной черты, времена не фиксируются. Две лошади не могут финишировать одновременно. Скорости лошадей постоянны: в каждом заезде лошадь скачет с одной и той же скоростью. Требуется за минимальное количество заездов определить первую, вторую и третью быстрейшую лошадь.
Эта задача немного сложнее предыдущей, и, соответственно, при нахождении искомой последовательности заездов проще ошибиться. Но если заранее знать, сколько должно быть заездов, то это мало того что позволяет проверить результат, это может еще и направлять ход мысли при поиске решения!
Что ж, попробуем подумать. Из условия следует, что если взять любые две лошади, то или первая будет быстрее второй, или вторая быстрее первой. Сформулируем, что именно нужно найти:
- лошадь, которая быстрее каждой из 24 остальных лошадей;
- лошадь, которая быстрее каждой из оставшихся 23;
- лошадь, которая быстрее каждой из оставшихся 22.
Таким образом, для получения ответа нужно знать по меньшей мере 24 + 23 + 22 = 69 отношений «быстрее».
Теперь заметим, что каждый заезд из 5 лошадей дает нам 4 + 3 + 2 + 1 = 10 отношений. После этого легко найти минимальное количество заездов: просто поделим 69 на 10 и округлим вверх. Выходит, что нужно как минимум 7 заездов. Конкретную расстановку лошадей не буду приводить, можете сами определить, если хотите.
При построении проверки, разумеется, тоже можно провраться. Но здесь уже решение может выступить в роли проверки для проверки. Все-таки случаи взаимной совместимости неправильного решения и неправильной проверки маловероятны.
В заключение хочу сказать, что все вышесказанное вполне применимо не только к математическим задачкам, но и к разнообразным жизненным ситуациям, в чем я не раз убеждался.


