#P2119. ACSL 2023-2024 Senior Division Contest #3 Rack-O
ACSL 2023-2024 Senior Division Contest #3 Rack-O
Description
问题:Rack-O游戏中,每位玩家都会收到10张卡牌,每张卡牌上都印有一个位于 到 之间的数字。每位玩家按照发牌顺序,将这 张卡牌从前至后摆放在一个带卡槽的架子上。每位玩家从抽牌堆中抽牌,在一系列抽取的过程中,玩家可以用被抽到的卡牌替换在牌架上的一张卡牌。游戏目标是使得牌架上所有卡牌按升序排列。第一位达成游戏目标的玩家获胜。
在ACSL版的Rack-O游戏中,玩家会被告知卡槽数量 ,以及卡牌数量 。每张卡牌上都有一个在 到 之间(包括 和 )的专属数字。玩家将会收到 张卡牌,然后将这些卡牌从前至后摆放在牌架上。除此之外,玩家还会收到一叠卡牌,形成一个抽牌堆。玩家从抽牌堆中抽取下一张卡牌,然后将其放在牌架上尽可能最佳的位置(卡槽)或者放弃这张卡牌。但是,由于玩家不知道之后会抽到什么卡牌,所以这张卡牌无法被放在最佳放置上。对此,我们使用 启发式 方法——在各种可选策略中选择被认为是最佳的策略值。
我们将采用的启发式值指的是 递减 次数。在此游戏中,递减指的是牌架上某一张卡牌小于
其前一卡槽中的卡牌(例如,在40、20、30、50、70中,数字 后发生一次递减)。如
果牌架上有 次递减,则表示整个牌架是按照升序排列,此时游戏结束。因此,启发式值越低,牌架上的卡牌排列情况越接近游戏目标。
如果以下策略中的某一种策略可行的话,则执行这种策略。这种策略要么能降低启发式值,
要么保持启发式值不变。如果启发式值不变,则选择策略 A。否则,放弃抽到的卡牌。
- A. 理想卡槽:为每个卡槽创建一个区间,这个区间是一个理想的数字组合。为了确定每个卡槽的区间大小,可以使用公式。如果 是 的倍数,则使用公式 ;否则使用公式 。例如,如果有 个卡槽和 张牌,则每个区间的大小为 。如果 不是 的倍数,则最后一个卡槽的区间可能较小。接下来,确定每个卡槽中可能可以放置的数字。例如,对于卡槽1 - 4,每个卡槽可放置的数字范围分别为
1-7、8-14、15-21、22-25。被抽到的卡牌可以被放在它理想的卡槽的前提是该卡槽中已经存在的卡牌不在其理想区间内。例如,如果抽到的卡牌 ,则只有当卡槽3中已经存在的卡牌不在 到 之间(包括 $15 和 21)时,才将其放在其卡槽3 中。 - B. 升序:从牌架前方开始,找到第一组未按升序排列的3张卡牌。在这一组卡牌中,上用抽到的卡牌替换其中某一张卡牌使得这3张卡牌按升序排列。例如,如果牌架是 10、20、30、9、40,那么第一组 3 个相邻但未按升序排列的卡牌数字就是 20 、30、9。如果抽到的卡牌是 33(或者任何一个比 30 大的数),则将其放入第 4 个卡槽中。如果抽到的卡牌是 25,则放弃使用这张卡牌。如果还存在其他类似的组合,则继续沿着牌架寻找下一组卡牌。一旦牌架上的卡牌按升序排列,游戏结束,不再抽牌。当抽牌堆为空时,游戏也会结束。游戏结束时,以一个数字字符串的形式输出整个牌架,各数字之间用一个空格隔开。
Format
Input
输入三个字符串:卡槽数量及卡牌数量;牌架上的卡牌;抽牌堆中的卡牌。各个数字之间用一个空格隔开。卡槽数量不超过 20 个,可能有的卡牌数量不超过 200 个
Output
游戏结束时,以一个字符串的形式从前至后输出牌架上的卡牌,其中每个数字之间用一个空格隔开。
Samples
9 70
40 35 30 56 32 58 44 17 45
31 37 10 28 21 62 7 64 16 12
7 10 21 31 32 37 44 62 64
