Недавно прошел отборочный этап на интенсивы в рамках фестиваля RuCode 2020: https://www.rucode.net/
Я попробовал прорешать все задачи отбора (ссылка на условия) и у меня возник затык на задаче L.
Если вас заинтересовали задачи — в данный момент там есть возможность запустить виртуальный контест с последующим дорешиванием, для этого необходимо зарегистрироваться и в личном кабинете заполнить анкету, после чего вам выдадут логин/пароль.
Вопрос, в основном, к решавшим данный контест и решившим задачу L (про битву двух команд магов).
Я написал решение динамическим программированием по битмаскам:
dp[номер текущего мага][маска живых в текущей команде][маска живых в команде противника] = (вероятность победы текущей команды, вероятность ничьей для текущей команды).
Чтобы вычислить ответ, я перебираю всех живых магов противника, для каждого вычисляю динамику в случае, если в него попали и если нет, после чего считаю суммарные вероятности победы/ничьей и сравниваю с оптимальным вариантом.
Решение падает на 13 тесте с неправильным ответом (на всякий случай уточню, что уже с 4 теста N = 8). Вот ссылка на решение: https://ideone.com/TuAlnY
У меня нет идей какого-либо стресса, так как само решение уже переборное.
Я пробовал ставить fixed вывод — 2/6/10/15 знаков после запятой — вердикт тот же.
Пробовал long double — вердикт тот же.
Даже пробовал смотреть видео с разбором в группе ВК "Moscow Workshops" — оно закончился после разбора задачи K.
Просто, в отличие от других задач, я не особо понимаю, как вообще искать ошибку в решении для данной задачи.
Заранее спасибо.
Дело в случаях, когда вероятности победы равны, и нам надо максимизировать вероятность ничьей. Надо либо подбирать эпсилон, либо решать все в интах (точнее — в int128)
Спасибо большое, я попробую разобраться с этим. Не думал, что будут проблемы с точностью в этом моменте.