返回列表

4th place solution by hand

472. Santa 2021 - The Merry Movie Montage | santa-2021

开始: 2021-11-16 结束: 2022-01-12 数学与计算 数据算法赛
第4名解决方案:手工构造

第4名解决方案:手工构造

作者: Kei Harada (Grandmaster)
比赛: Santa 2021 - The Santa Competition
排名: 第4名

感谢举办这场有趣的比赛。作为新年假期的圣诞老人比赛是我的荣幸,我很高兴这一传统能够延续下去。

我的解决方案是手工构造的。我只使用计算机进行了简单的枚举。

无通配符情况下的 2440 分

在这个问题中,我们需要构造 3 个字符串,使得:

  • [1, 2, 3, 4, 5, 6, 7] 的每一个排列(共 5040 个)都至少包含在 1 个字符串中。
  • 所有形如 12xxxxx 的排列(共 120 个)都必须包含在所有字符串中。
    (1:圣诞老人先生,2:圣诞老人女士)

第二个条件似乎破坏了对称性,但实际上,正是因为这种巨大的破坏,反而留出了通过对称性构建解决方案的空间。

对我来说,关键的想法是 120 个 12xxxxx 形式的排列并不是浪费。
例如,
1273456 1237456 1234756 1234576 1234567
不仅仅是 5 个排列,它还是 2-循环(2-cycle)的一部分:
7 2345612 7 3456123 7 4561234 7 5612345 7 6123456 7 1234561 (7 2345612)

通过寻找不与这些重叠的良好字符串(2-循环的一部分),我发现了像这样的字符串:
1 2345672 1 3456723 1 4567234 1 5672345 1 6723456 1 7234567 (1 2345672)
通过去除与 12xxxxx 重复的部分,我们得到:
345672 1 3456723 1 4567234 1 5672345 1 6723456 1 723456 (长度 45)
如果我们固定 1 和 2,像这样的序列有 5! = 120 个,所以简单的分配将创建 3 个字符串,由 40 个这样的序列和 120 个 12xxxxx 组成。
长度是 45 * 40 + 7 * 120 = 2640。显然,我们可以合并 1234567 和 3456721... 等等,所以长度现在变成了 2440。
更准确地说,由于 12xxxxx 可能是重要序列的一部分,我们在合并它们时需要小心。但这并不是关键问题,因为所有 3 个字符串都包含所有 12xxxxx。

@jpmiller 的这个解决方案看起来很相似。
https://www.kaggle.com/c/santa-2021/discussion/300519

利用通配符从 2440 优化至 2428

如果我们理解了 2440 解决方案的结构,这就像是一个拼图。
当排行榜更新时,就是开始新比赛的时候了。不眠不休地思考。我做了两次(2430 -> 2429 -> 2428)。

2430 分

我们从 2440 解决方案开始,它由 40 个以下形式的序列组成:
12 345672 1 3456723 1 4567234 1 5672345 1 6723456 1 723456 (长度 47)
以及 80 个 12xxxxx。
我们应该用“全能”字符(通配符,记为 8)来生成 12xxxxx,因为直接生成效率低下,所以放置 8 的位置应该是:
12 345672 1 3456723 1 456