【问题标题】:Card Algorithm Game卡片算法游戏
【发布时间】:2015-12-14 00:11:15
【问题描述】:

我正在解决以下问题,并采用蛮力方法,但无法提出一个好的解决方案。问题如下:

有 2*N 卡。您和您的对手将它们分开(给您 N 张牌,给他们 N 张牌)。您确切地知道他们有什么牌以及他们将按什么顺序打牌。

游戏规则如下:在前 N/2 轮中,牌最高的人获胜,在最后 N/2 轮中,牌最低的人获胜。

考虑到这些规则以及你的对手出牌的顺序,你可以获得的最大胜利数是多少。

例子:

你有牌:2、5、6、7。 你的对手有牌:1、8、4、3,并按顺序打出。

你能得到的最高分数是 2,因为你打 7 对 1,输掉第 2 和第 3 轮,然后在最后一轮打 2 赢。

我的想法:把你的卡片分成两堆,你的编号较大的和编号较小的。然后找出最佳匹配。

非常感谢伪代码/算法的想法。

编辑:总共有 N 轮。前 N/2 轮:较高的牌获胜。最后 N/2 轮:较低的牌获胜。 N 必须是偶数。

【问题讨论】:

  • 如果你知道他们会按这个顺序玩1, 8, 4, 3,你最多可以赢3次......你会先玩你的2,然后再玩顺序无关紧要,因为剩下的牌没有一张能打败8,但它们都会打败43
  • @CalvinP.: vs 4, 3,是最低的获胜者...
  • 我已经对问题进行了修改。
  • 啊,这更清楚了规则/逻辑。你试过什么了?很高兴首先看到您的代码。编辑:另外,如果N 是奇数会发生什么?
  • 这些是我的想法:按我的卡片编号排列我的卡片。然后有两个问题,第一轮 N/2 轮和第二轮 N/2 轮。在上半年,我相信最大化配置将是当您的较大数字之间的差异最小时。但是,经过一些测试,它不起作用。我仍在解决这个问题,但正在看看你们是否有想法/帮助。

标签: algorithm graph game-theory


【解决方案1】:

我建议:

  • 将你的卡片分成更大/更低的 2 堆
  • 对它们进行排序
  • 按价值对对手更大的牌进行排序(第一轮)
  • 从大到小对手牌:
    如果您剩余的最大值低于对手的牌,则打出最低的牌(输)
    否则打出你最大的牌(赢)

类似lower堆,倒置顺序

【讨论】:

    【解决方案2】:

    首先,创建一个包含 N 个项目的数组(每轮一个)。每个项目都是该轮“获胜牌”的列表,即您将赢得该轮的牌组。在你的例子中,你会得到{{2567},{},{2},{2}}

    以下列表给出了应将卡片“分配”到一轮的一些情况。这意味着我们决定在那轮打出那张牌,之后任何事情都无法改变。分配一张牌后,算法应在从轮组中删除指定轮次并从获胜牌组中删除任何轮次的获胜牌组后继续进行算法。

    很明显,在任何情况下应用这些规则中的任何一条都不会减少可能获胜的次数,因此在开始暴力破解之前尽可能多地应用它们总是一个好主意。

    • 如果卡 C 可以赢得 R 轮,而卡 C 不能赢得其他轮,则将卡 C 分配给 R 轮。
    • 如果卡 C 不能在任何回合中获胜,并且回合 R 不能被任何卡赢得,则将卡 C 分配给回合 R。
    • 如果卡 C 可以在前 N/2 轮中获胜,但卡 C 无法在最后 N/2 轮中获胜,并且卡 C 是具有此属性的卡中最高的,分配卡 C 到它获胜的最困难的一轮(即卡 C 获胜的对手的最高牌)。
    • 如果卡 C 可以在最后 N/2 轮中的某些轮中获胜,但卡 C 在前 N/2 轮中的任何轮中都无法获胜,并且卡 C 是具有此属性的卡中最低的,分配卡 C 到它获胜的最困难的一轮(即卡 C 获胜的对手的最低牌)。

    请注意,将一张牌分配给一个回合会同时改变回合和在每一回合中获胜的牌,因此即使其中一个规则不适用,在应用其他规则后它也可能变得适用。因此,必须反复尝试它们,直到对它们进行完整的迭代,不会产生新的分配。

    这不是一个确定的解决方案,但它肯定会让最后的暴力破解步骤变得更容易。

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2011-11-10
      • 1970-01-01
      • 2017-09-11
      • 2021-03-12
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多