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 imes 100),所以可行的(MUL)也至多为这个数,差不多在(2^{16})左右。所以还是可以暴力枚举判断,只需要加加剪枝就可以了。
枚举过程中,若(MUL > SUM),则后续的枚举就可以剪掉。
Test Set 3
现在(SUM)至多为(499 imes 10^{15}),差不多在(2^{60})左右,暴力枚举已经不太行了。
可以推出集合2中至多有60个元素,由此可以推出集合2中的元素之和有一个非常宽松的上界(499 imes 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})种方法。即:
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
的概率就是
时间复杂度为(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.