...

вторник, 18 ноября 2014 г.

Решение задач на определение фальшивой монеты взвешиванием 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 — остаток.

По условию задачи


26/3 = 8.666(6),


26 = 2 * 9 + 8,


При первом взвешивании будут сравниваться две группы: правая (ПГ) — 9 монет и левая (ЛГ) — 9 монет.


Далее у нас возможны два варианта:


1) фальшивая монета в левой/правой группе (9 монет)

2) фальшивая монета в остатке (8 монет)


для 1 варианта следующее деление на группы будет — 9 = 2 * 3 + 3;

для 2 варианта — 8 = 2 * 3 + 2


Ну и за одно взвешивание можно определить какая из 2 или 3 монет легче/тяжелее


Этот же результат я приведу в таблице













































№ взвешиванияЧисло монетЛГПГОстаток
126998
28332
29333
32110
33111

по формуле — log326 =2.9656 — соответственно количество взвешиваний — 3.


еще пример:

число монет- 71. По формуле log371 =3.8800 — количество взвешиваний — 4. Проверяем



























































№ взвешиванияЧисло монетЛГПГОстаток
171242423
223887
224888
37331
38332
42110
43111

Ну с алгоритм решения этих задач, я думаю, понятен.


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 + 1

Итог:




1) если известно, что фальшивая монета легче/тяжелее, тогда максимальное число взвешиваний определяется по формуле:

N >= log3A


2) если не известно, какая фальшивая, тогда максимальное число взвешиваний определяется по формуле:


N >= log3A + 1


где N — максимально необходимое количество взвешиваний, натуральное число, округленное в большую сторону;

А — количество монет.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий