У вас есть n
монеты, каждая из которых весит -1 или 1. Каждая помечена от 0
до, n-1
чтобы вы могли различить монеты. У вас есть одно (волшебное) весовое устройство. На первом повороте вы можете положить столько весов, сколько вам нужно, на весы, которые способны измерять как отрицательные, так и положительные веса, и он точно скажет вам, сколько они весят.
Однако в весовом устройстве есть что-то действительно странное. Если вы кладете монеты x_1, x_2, ..., x_j
на устройство в первый раз, то в следующий раз вам нужно будет положить монеты (x_1+1), (x_2+1) , ..., (x_j+1)
на шкалу, за исключением того, что вы, конечно, не можете положить монету с номером выше, чем n-1
. Мало того, что для каждого нового взвешивания вы можете выбрать, хотите ли вы поставить монету 0
на весы.
Согласно этому правилу, какое наименьшее количество взвешиваний всегда будет точно указывать, какие монеты весят 1, а какие - -1?
Очевидно, что вы могли бы просто положить монету 0
на устройство в первый ход, а затем потребовались бы именно n
взвешивания для решения проблемы.
Языки и библиотеки
Вы можете использовать любой язык или библиотеку, которая вам нравится (которая не была разработана для этой задачи). Тем не менее, я хотел бы иметь возможность протестировать ваш код, если это возможно, поэтому, если вы можете предоставить четкие инструкции по его запуску в Ubuntu, это было бы очень полезно.
Гол
Для данного результата n
ваш результат n
делится на количество взвешиваний, которое вам нужно в худшем случае. Чем выше баллы, тем лучше. В эту загадку нет входных данных, но ваша цель - найти тот, n
за который вы можете получить наивысший балл.
Если есть связь, побеждает первый ответ. В крайне маловероятной ситуации, когда кто-то находит способ получить бесконечное количество очков, он сразу же выигрывает.
задача
Ваша задача - просто написать код, который получает самый высокий балл. Ваш код должен будет как правильно выбрать n, так и затем оптимизировать количество взвешиваний для этого n
.
Ведущие записи
4/37/5 в Python от Sarge Borsch- 26/14 на Яве Питер Тейлор
источник
x_i
: мы можем иметь, например, первое взвешивание (x_1, x_2, x_3) = (3, 2, 7), а затем второе взвешивание может быть (4, 3, 8) или ( 0, 4, 3, 8). Этикетки для монет не должны быть последовательными, а индексi
вx_i
не относится к этикетке монеты.Ответы:
C ++, счет
23/1225/1327/1428/14 = 231/15Решения Matrix свойство X повторно (или Радость X) могут непосредственно использоваться в качестве решений этой проблемы. Например, решение из 31 строки 15 столбцов:
строка N представляет, какие монеты вы положили на шкалу для измерения N. Какими бы ни были результаты взвешивания, которые вы получаете, очевидно, есть некоторый набор значений монет, который дает этот вес. Если есть и другая комбинация (решение не уникально), подумайте, чем они отличаются. Вы должны заменить набор взвешивания
1
монет на взвешивание монет-1
. Это дает набор столбцов, которые соответствуют этому отражению. Существует также набор монет весом,-1
который вы заменяете1
. Это еще один набор столбцов. Поскольку измерения не меняются между двумя решениями, это означает, что суммы столбцов двух наборов должны быть одинаковыми. Но решения Matrix свойство X вновь (или Радость X) это именно те матрицы, где такие наборы столбцов не существуют, поэтому нет дубликатов, и каждое решение уникально.Каждый фактический набор измерений может быть описан некоторой
0/1
матрицей. Но даже если некоторые наборы столбцов суммируют одинаковые векторы, возможно, что знаки значений монет-кандидатов решения не точно соответствуют такому набору. Так что я не знаю, являются ли матрицы, подобные приведенной выше, оптимальными. Но, по крайней мере, они обеспечивают нижнюю границу. Таким образом, возможность того, что 31 монета может быть сделана менее чем за 15 измерений, все еще открыта.Обратите внимание, что это верно только для нефиксированной стратегии, когда ваше решение поставить монету
0
на весы зависит от результата предыдущих взвешиваний. В противном случае у вас будут решения, в которых знаки монет соответствуют наборам с одинаковой суммой столбцов.источник
Python 2, оценка = 1,0
Это простой результат, если никто не находит лучший результат (сомнительно).
n
взвешивания для каждогоn
.Я импортировал,
antigravity
чтобы программа могла работать с отрицательными весами.источник
antigravity
в основном не работает, верно?Оценка = 26/14 ~ = 1,857
Сохранить как
LembikWeighingOptimisation.java
, скомпилировать какjavac LembikWeighingOptimisation.java
, запустить какjava LembikWeighingOptimisation
.Большое спасибо Митчу Шварцу за то, что он указал на ошибку в первой версии быстрого отказа.
Здесь используются довольно простые методы, которые я не могу строго обосновать. Это грубые силы, но только для начала операций взвешивания, в которых используется не более половины монет: последовательности, в которых используется более половины монет, не могут быть напрямую перенесены на дополнительные взвешивания (потому что мы не знаем общий вес), но на уровне волнистости рук должно быть примерно столько же информации. Он также перебирает начальные взвешивания в порядке количества задействованных монет, исходя из того, что таким образом он покрывает рассредоточенные взвешивания (которые, как мы надеемся, дают информацию о верхнем конце относительно рано) без предварительного обхода сгустка, который начинается с плотного подмножества в нижний конец.
Этот
MaskRange
класс является существенным улучшением предыдущей версии с точки зрения использования памяти и устраняет узкие места в GC.источник
Python 3,
оценка = 4/3 = 1,33… (N = 4)оценка = 1,4 (N = 7)Обновление: реализован поиск методом "грубой силы" в наборе "статических" решателей и получен новый результат
Я думаю, что это может быть улучшено путем поиска динамических решателей, которые могут использовать результаты взвешивания для дальнейших решений.
Вот код Python, который ищет во всех статических решателях небольшие
n
значения (эти решатели всегда взвешивают одни и те же наборы монет, отсюда и «статическое» имя) и определяет количество шагов в наихудшем случае, просто проверяя, что результаты их измерений допускают только одну совпадающую монету. установить во всех случаях. Кроме того, он отслеживает лучшие результаты, найденные до сих пор, и ранние решатели чернослива, которые показали, что они определенно хуже, чем те, которые были найдены ранее. Это была важная оптимизация, иначе я не мог дождаться этого результата сn
= 7. (Но он все еще не очень хорошо оптимизирован)Не стесняйтесь задавать вопросы, если не ясно, как это работает ...
Выход:
Эта линия
(StaticSolver({0,2}, {0,1,3}, {0,1,2,4}, {1,2,3,5}, {0,2,3,4,6}), 5), score = 7/5 = 1.4
раскрывает лучший найденный решатель. Цифры в{}
скобках - это индексы монет, которые нужно надевать на весы на каждом шаге.источник