我正在玩下面的问题并采用暴力方法,但无法提出一个很好的解决方案。问题如下:
有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必须是均匀的。
答案 0 :(得分:2)
我建议:
类似于 lower 桩,反转订单。
答案 1 :(得分:1)
首先,创建一个包含N个项目的数组(每轮一个)。每个项目都是"获胜卡片的列表"对于那一轮,即你赢得那一轮的那套牌。在您的示例中,您获得{{2567},{},{2},{2}}
。
以下列表列出了一些卡应该被分配的情况"一轮。这意味着我们决定在那一轮比赛中打出那张牌,之后什么都不会改变。在分配了一张牌之后,该算法应该在从一组回合中移除分配的回合以及从任何回合的获胜卡组中分配的牌后继续。
显而易见的是,在任何情况下应用任何这些规则都不会减少可能获胜的数量,因此在开始蛮力之前尽可能多地应用它们总是一个好主意。
请注意,将牌分配给一轮可以更改每轮中获胜的牌和牌,因此即使其中一条规则不适用,也可以在应用其他规则后适用。所以必须迭代地尝试它们,直到对它们进行完全迭代才会产生新的赋值。
这不是一个明确的解决方案,但它肯定会让最后的暴力步骤更容易。