Recollect Numbers

有 2n 张卡片,上面分别写着数字 1,1,2,2,…,n,n。换句话说,对于每个 j=1,2,…,n,恰好有两张卡片写着 j。每张卡片正面只写了一个数字。 你要玩一个翻牌游戏。初始时,所有 2n 张卡片都背面朝上(没有数字的那一面)。每一回合,你恰好翻开两张卡片。如果这两张卡片上的数字相同,就把它们丢弃;否则,把它们翻回背面朝上。当所有 2n 张卡片都被丢弃时,你就赢了。注意:你不必同时翻开两张牌,所以在看到第一张牌的数字后,你可以根据它来决定第二张要翻哪一张。 考虑下面这个“贪心”算法来玩这个游戏。初始时,2n 张卡片以任意顺序排成一行。然后每回合的策略如下:

如果有两张你之前翻开过且数字相同的卡片,就翻开那两张(配对丢弃它们)。 否则,翻开至今从未翻开过的最靠左的那张牌作为第一张。假设这张牌的数字是 x。 之后,如果之前已经翻开过另一张数字为 x 的牌,就翻开那一张(配对)。 否则,翻开至今从未翻开过(包括本回合刚翻的第一张也不算已翻开)的最靠左的那张牌作为第二张。

可以证明,这个算法在每一回合的策略都是唯一确定的。 你需要解决关于上述算法的以下问题: 给定 n 和 k,请找出一个 2n 张卡片的排列顺序,使得上述算法恰好需要 k 回合才能赢下游戏。 另外,如果这样的排列不存在,请报告出来。

做法及思路

  • 不难想到 1 1 2 2 3 3 可以最小次数。即 n 次

  • Try 1 2 3 1 2 3 但是样例都过不去。

  • 最多的次数:因为每个数字来说,第一次是得知数字是多少,第二次是删掉这对数字。因此是 n / 2 + n

  • 但是不是这样,我们发现第一次得知数字是多少,第二次的时候没有办法直接删掉。因为他是被翻牌的一对数字中的后一个。因此没有办法直接删这对数字,还要重新删一次。

  • 发现可以用 2 1 3 1 4 2 5 3 6 4 7 5 6 7 来构造。其实是读了样例才想到的。此时几乎所有数字,都需要两次才能被消除。 然后找到规律以后就枚举 + 构造。