Помогите разобраться в проблеме разделения конфет Google Code Jam 2011

#math #binary

#математика #двоичный

Вопрос:

Я участвую в Google Code jam. Прежде всего я хочу сказать, что я не хочу, чтобы кто-либо решал мне задачу «на победу» или что-то в этом роде. Мне просто нужна помощь, чтобы понять проблему, которую я не смог решить в уже завершившемся раунде.

Вот ссылка на проблему, называемую разделением конфет. Я не буду объяснять это здесь, потому что это nosense, я не смогу объяснить это лучше, чем Google.

Я хотел бы знать какое-нибудь «хорошее» решение проблемы, например, я скачал первое решение на английском языке и увидел, что в коде всего 30 строк!!! Это потрясающе! (Любой может скачать ее, поэтому я думаю, что нет проблем с тем, чтобы сказать это: решение theycallhimtom отсюда). Я не могу понять решение, даже просматривая код. (Мое незнание Java не помогает.)

Спасибо!

Ответ №1:

Сами Google предоставляют обсуждения проблем и решения

Смотрите эту ссылку для решения проблемы разделения конфет:http://code.google.com/codejam/contest/dashboard?c=975485#s=aamp;a=2

В принципе, конфеты можно разделить на две стопки одинакового значения (с точки зрения Патрика), если

 C[0] xor C[1] xor C[2] xor ... xor C[N] == 0.
  

Одним из таких разделений является сумма всех значений candy, кроме одного. Чтобы максимизировать ценность одной стопки, возьмите конфету с наименьшей стоимостью и положите ее в отдельную стопку.

Почему это так?

Я думал об этом так, что по определению добавление Патрика фактически равно значениям xoring. Исходя из определения проблемы, мы хотим

 C[i] xor C[j] xor ... xor C[k] == C[x] xor C[y] xor ... xor C[z]
  

для некоторых элементов с каждой стороны.

Добавление RHS как к LHS, так и к RHS приводит

 C[i] xor C[j] xor ... xor C[k] xor C[x] xor C[y] xor ... xor C[z] == 0
  

Поскольку преобразование значения в xor само по себе дает 0, а порядок операций xor не важен, значение RHS становится равным 0.

Любой из элементов в LHS можно переместить в правую часть, и равенство останется в силе. Выбор элемента с наименьшим значением обеспечивает наилучшее разделение между стопками.

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

1. Я знаю, что (conditionA xor conditionB) равно (conditionA или conditionB и ! (conditionA и conditionB)) но что это значит (myIntA xor или myIntB)?

2. ОК. Я прочитал это отсюда: en.wikipedia.org/wiki/Bitwise_operation#XOR теперь, почему верно ваше предложение «конфеты можно разделить на две стопки с равным значением, если c[0] xor c[1] … == 0»?