A - Determinant
輸入輸出。
B - Quizzes
簡單模擬。
C - Super Ryuma
分類討論,萬萬沒想到這題是花時間最多的。
- 一步可達:滿足題目中的條件。
- 兩步可達:
- 走一次對角線后歐幾里得距離小於三,此時可以直接枚舉和\((r_2, c_2)\)歐幾里得距離小於三的點,然后看是否能夠通過一次走對角線到達\((r_1, c_1)\)。
- 走兩次對角線:就是過\((r_1, c_1)\)的對角線和過\((r_2, c_2)\)的對角線有整數交點。
- 不然必定三步可達,具體就是先走到對角線交點附近,在走到過\((r_2, c_2)\)的對角線上,最后到達\((r_2, c_2)\)。
D - increment of coins
概率DP。
由於參數都很小,所以整了個\(O(n^3)\)的DP。
令\(dp_{i, j, k}\)表示三種硬幣數量分別為\(i, j, k\)的概率,初始時只有\(dp_{a, b, c} = 1\),其余皆為零。
一次操作時,選金幣的概率為\(\frac{i}{i + j + k}\),選了之后轉移到\(dp_{i + 1, j ,k}\)。所以\(dp_{i + 1, j, k} += dp_{i, j, k} \times \frac{i}{i + j + k}\)。
若金幣數量達到100則結束,根據期望的定義\(E = \sum_{i = b} \sum_{j = c} (100 + i + j - a - b - c) \times dp_{100, i, j}\)。
銀幣和銅幣同理。
E - Third Avenue
經典優先隊列+BFS。
就是多寫通過傳送轉移的部分。具體就是如果是第一次走到小寫字母\(ch\)的格子,就枚舉一遍所有\((i, j)\),看是否能夠傳送到\((i, j)\)。如果不是第一次走到,那么通過傳送必不可能達到更優的答案,所以這個時候只考慮上下左右的轉移就可以了。
時間復雜度\(O(26nm)\)。
F - Programming Contest
暴力+trick優化。
將這\(n\)個數等分成兩部分。對於其中的一部分,暴力枚舉\(2^{n_1}\)種情況,然后就得到了前\(n_1\)個數可能得到的所有結果,用數組\(t_1\)保存。
特別的,如果用的遞歸枚舉,還可以加剪枝。
第二部分同理。
對\(t_1\)和\(t_2\)升序排序,然后就是\(t_1\)中拿一個數,\(t_2\)拿一個數,問組成的最大的不超過\(T\)的數是多少。這個就是比較經典的題了,二分或者雙指針亂寫完事。
時間復雜度\(O(2^{20} \log 2^{20})\),主要是排序的復雜度。