Google Code Jam 2021 Round1A 题解

Append Sort

贪心。对于\(i \ge 2\),每次将\(s_i\)修改成所有满足条件的数中最小的那个。

不妨将\(s_i\)看成字符串。

如果\(s_i\)\(s_{i - 1}\)的前缀,那么一个可能的解是\(t = str(int(s_{i - 1}) +1)\),或者不断补0直至\(len(s_i) = len(s_{i - 1}) + 1\)。前者若可行则会更优。前者可行的条件为\(s_i\)\(t\)的前缀。

如果\(s_{i - 1} < s_i\),不断补0直至长度相等。

否则,不断补0直至\(len(s_i) = len(s_{i - 1}) + 1\)

Prime Time

Test Set 1

\(\sum_i N_i\)很小,可以直接暴力枚举。

\(SUM\)为集合1的和,\(MUL\)为集合2的乘积。

假设一开始所有数都属于集合1,不断尝试将集合1中的某个数移到集合2。

Test Set 2

由于\(SUM\)至多为\(499 \times 100\),所以可行的\(MUL\)也至多为这个数,差不多在\(2^{16}\)左右。所以还是可以暴力枚举判断,只需要加加剪枝就可以了。

枚举过程中,若\(MUL > SUM\),则后续的枚举就可以剪掉。

Test Set 3

现在\(SUM\)至多为\(499 \times 10^{15}\),差不多在\(2^{60}\)左右,暴力枚举已经不太行了。

可以推出集合2中至多有60个元素,由此可以推出集合2中的元素之和有一个非常宽松的上界\(499 \times 60 = 29940\),这又可以推导出可能的\(SUM\)至多有\(29940\)个。

枚举所有可能的\(SUM\),若可行,则\(MUL = SUM\),对\(MUL\)进行质因数分解,在判断是否可行就可以了。由于\(MUL\)可能的质因数为输入的素数,所以这里质因数分解其实挺快的。

Hacked Exam

Test Set 1

无脑暴力。

Test Set 2

n=1

\(p_i\)表示第\(i\)道题,答案和学生1相同的概率,那么若\(p_i \ge \frac{1}{2}\),第\(i\)道题就和学生1填一样的,反之填和学生1相反的。

\(q\)道题中有\(score_1\)道题是对的,共\(C_{q}^{score_1}\)种方法。

如果学生1第\(i\)道题是对的,那么现在就是\(q - 1\)道题种,有\(score_1 - 1\)道题是对的,共\(C_{q - 1}^{score_1 - 1}\)种方法。即:

\[p_i = \frac{C_{q - 1}^{score_1 - 1}}{C_{q}^{score_1}} = \frac{score_1}{q}。 \]

n=2​

可以用动态规划(记忆化搜索)做。

\(p_i\)表示第\(i\)道题,答案为T的概率。

\(f(s_1, s_2, i)\)为仅考虑第\(i\)道以及之后的问题,且满足此时学生1的分数为\(s_1\),学生2的分数为\(s_2\),的方法数。

那么\(f(s_1, s_2, i) = f(s_1 - g(1, i, T), s2 - g_2(i, T),i + 1) + f(s_1 - g(1, i, F), s_2 - g(2, i, F), i + 1)\)

其中,\(g(a, b, c)\)表示若正确答案为\(c\),第\(a\)个学生第\(b\)道题的得分。

那么,第\(1\)道题的答案为T的概率就是

\[p_1 = \frac {f(s_1 - g(1, 1, T), s_2 - g(2, 1, T), 2)} {f(s_1, s_2, 1)}。 \]

时间复杂度为\(O(Q^3)\)

由于问题的顺序并不会影响最终的结果,所以可以每次将题目\(i\)移动到第1个位置,然后跑出\(p_i\)。这样子的时间复杂度为\(O(Q^4)\)

其实对于所有学生1给出答案T,学生2给出答案T的题目,这些题目其实是等价的,同理可以类推,一共有\(4\)种类型的题目(TT,TF,FT,FF)。每种类型跑一遍记录下来就可以了,没有必要跑多次。这样子的时间复杂度为\(O(Q^3)\)

其实,\(P_{TT} = 1 - P_{FF}, P_{TF} = 1 - P_{FT}\),所以也可以只跑\(P_{TT}, P_{TF}\),再去推\(P_{FF}, P_{FT}\)

Test Set 3

TO BE SOLVED.

posted @ 2021-04-10 17:23  _Backl1ght  阅读(351)  评论(0编辑  收藏  举报