Жадные алгоритмы на примере карточной игры

Вы играете в новую карточную игру. У каждого из вас и компьютера есть карточная колода. Компьютер выкладывает карту, затем вы выкладываете свою карту. Каждая карта имеет значение Силы, при этом выигрывает карта с более высоким значением силы. Если у вас и у компьютеров If одинаковые сильные карты, компьютер побеждает. Вы знаете карты компьютера. Ваша цель — подсчитать сумму значений силы ваших выигрышных карт «Максимизировать». Для этого вы получаете два целочисленных массива, которые представляют ваши карты и карты компьютера.

У вас будут карты [5, 15, 100, 1, 5]. Компьютер использует те же карты, поэтому также [5, 15, 100, 1, 5]. Когда компьютер ставит свои 100, вы ставите свою 1, так как вы не можете выиграть. Если он ставит свои 15, вы ставите свои 100 и выигрываете. Если он выложит свою 5, то выложит вашу 15-ю. Если он выложит свои вторые 5, то кладите, вы получаете свои 5 и проигрываете этот раунд. Если он поставит свою 1, вы ответите своей 5-й суммой. вы получите выигрышные карты на сумму 120.

Задача: Опишите идею вашего жадного алгоритма, который может вычислить сумму. i.stack.imgur.com/3sKvb.jpg" alt="введите здесь описание изображения" />

Мой алгоритм: когда компьютер кладет самую большую карту из своей колоды (в данном случае 100), я ставлю наименьшее число в моем случае 1. Я бы продолжил это и в я бы писал всякий раз, когда я выигрываю, добавляю результат

Есть ли у кого-нибудь другие предложения по жадному алгоритму


person TheRealChickenWing    schedule 30.11.2020    source источник


Ответы (1)


Ваша мысль правильная. Здесь есть еще один момент для размышления.

Для [5, 15, 100, 1, 5],

  1. Компьютер выбрасывает 5, а вы выбрасываете 100, потому что он самый большой.
  2. Следующий компьютер выкинет 15, теперь у вас максимум 15 и вы потеряете очко.

Чтобы избежать этого, вы должны выбрать ближайший максимум к заданному числу.

  1. Когда компьютер выдает 5, вы выбрасываете 15.
  2. Когда компьютер выбрасывает 15, вы выбрасываете 100 и получаете очко.

Если все карты уникальны, вы можете выиграть (n-1) очков таким образом, где n — размер массива.

Таким образом, алгоритм должен был бы найти следующий максимум. Если возможно найти его, верните его или верните наименьшее число в массиве.

person Maruthi Adithya    schedule 30.11.2020
comment
Если вы не можете победить своего противника, то выложите самую маленькую карту, которая у вас есть, а если вы можете победить противника, то побейте его самой маленькой картой из возможных. - person TheRealChickenWing; 30.11.2020
comment
Проблема для меня в том, как сформулировать жадный алгоритм - person TheRealChickenWing; 30.11.2020
comment
@TheRealChickenWing: один из простых способов — отсортировать массив в порядке убывания. Когда компьютер воспроизводит значение [0], вы воспроизводите значение [массив.длина - 1]. Когда компьютер воспроизводит значение [индекс], вы воспроизводите значение [индекс - 1]. - person Gilbert Le Blanc; 30.11.2020
comment
@TheRealChickenWing Если вы используете массив, проблема в том, что вам нужно осторожно обрабатывать удаления в середине. Учитывая это, лучшим решением для поиска следующего большего числа и его удаления будет двоичное дерево поиска. - person Maruthi Adithya; 01.12.2020