Решение задач на определение фальшивой монеты взвешиванием 2.0
Сегодня я снова хочу вернуться к теме о задаче нахождении фальшивой монеты методом взвешивания на весах без циферблата.
Наиболее распространенные из таких задач — определение количества взвешиваний для выявления фальшивой монеты, если:
1) неизвестно какая она по весу; 2) известно, что она легче/тяжелее остальных.
Или обратная задача: можно ли за определенное количество взвешиваний выявить фальшивую из заданного количества монет.
1. Давайте сначала разберемся с 2 вариантом, который является частным случаем варианта 1.
Некоторое время назад, я на Хабре уже описывал решение такой задачи, но в одном из комментариев было замечание о немного странном первом разделении монет, по-этому предлагаю другой алгоритм решения. Хотя результат будет тот же и формула решения задачи остается та же:
N >= log3A,где N — максимально необходимое количество взвешиваний, натуральное число, округленное в большую сторону; A — количество монет. Которая выведена на основании опытов (за 1 взвешивание можно найти одну фальшивую из 3-х монет, за 2 — из 9, за 3 — из 27 и т.д.)
Сам алгоритм решения простой, и я покажу его на примерах
1) Пусть у нас есть 26 монет. Нужно найти одну, которая легче/тяжелее
Первым действием буде разделение монет на три группы, в двух из которых число монет будет одинаковым, важно только что бы в третьей группе — остатке — было меньше монет, чем в каждой из двух других групп. То есть частое округляется к большему натуральному числу. То есть
A = 2 * B + C,где A — количество монет; B — частное от деления количества монет на 3, натуральное число, округленное в большую сторону; C — остаток.
По условию задачи
При первом взвешивании будут сравниваться две группы: правая (ПГ) — 9 монет и левая (ЛГ) — 9 монет.
Далее у нас возможны два варианта:
1) фальшивая монета в левой/правой группе (9 монет) 2) фальшивая монета в остатке (8 монет)
для 1 варианта следующее деление на группы будет — 9 = 2 * 3 + 3; для 2 варианта — 8 = 2 * 3 + 2
Ну и за одно взвешивание можно определить какая из 2 или 3 монет легче/тяжелее
Этот же результат я приведу в таблице № взвешивания Число монет ЛГ ПГ Остаток 1 26 9 9 8 2 8 3 3 2 2 9 3 3 3 3 2 1 1 0 3 3 1 1 1
по формуле — log326 =2.9656 — соответственно количество взвешиваний — 3.
еще пример: число монет- 71. По формуле log371 =3.8800 — количество взвешиваний — 4. Проверяем
№ взвешивания Число монет ЛГ ПГ Остаток 1 71 24 24 23 2 23 8 8 7 2 24 8 8 8 3 7 3 3 1 3 8 3 3 2 4 2 1 1 0 4 3 1 1 1
Ну с алгоритм решения этих задач, я думаю, понятен.
2. Теперь перейдем к задачам, в которых не известно легче монета или тяжелее.
В данном случае я предлагаю такое первое действие: разделить монеты на четыре группы, три — с максимально одинаковым количеством монет, а в четвертой группе — остаток. Причем в остатке должны быть 1 или 2 монеты. То есть при делении на 3 частное округляется до меньшего натурального числа.
A = 3 * B + C,где A — количество монет; B — частное от деления количества монет на 3, натуральное число, округленное в меньшую сторону; C — остаток.
Например, для 58-ми монет — это будет 58 = 3 * 19 + 1, для 23 = 3 * 7 + 2, для 15 = 3 * 5 + 0 и т. д.
Далее выполняем два взвешивания: 1) первая и вторая группы; 2) первая и третья группы; и анализируем результат. Здесь возможны четыре варианта:1, 2, 3 — это первая, вторая или третья группа отличаются по весу от двух остальных, или они равны, тогда нам повезло, так как фальшивая — в остатке. Так же два взвешивания помогают определить определить тяжелее фальшивая монета или легче. Кстати, если в остатке две монеты, то нужно выполнить еще 2 взвешивания для определения фальшивой монеты.
Теперь у нас есть задача: определить одну фальшивую монету из группы, которая легче/тяжелее. Что касается формулы, то она примет следующий вид
N >= log3B + 2,где N — максимально необходимое количество взвешиваний, натуральное число; B — количество монет в группе после второго взвешивания. А если учесть, что B = A/3, где A — количество всех монет, тогда получим:
log3B = log3A — 1, N >= log3A + 11) если известно, что фальшивая монета легче/тяжелее, тогда максимальное число взвешиваний определяется по формуле:
N >= log3A2) если не известно, какая фальшивая, тогда максимальное число взвешиваний определяется по формуле:
N >= log3A + 1где N — максимально необходимое количество взвешиваний, натуральное число, округленное в большую сторону; А — количество монет.