AtCoder Regular Contest 059
文章目錄
- C - Be Together
- D - Unbalanced
- E - Children and Candies
- F - Unhappy Hacking
題目鏈接
C - Be Together
200200200分 結論
直接取所有數的平均數,由于需要是整數,所以算一下mid,mid+1,mid?1mid,mid+1,mid-1mid,mid+1,mid?1,取最小值即可。
代碼
D - Unbalanced
400400400分 結論
不難發現如果有一段是合法的那么一定存在長度為222或者333的串合法,直接找即可。
代碼
E - Children and Candies
800800800分 dpdpdp + 前綴和優化
題面太陰間了,簡單解釋一下。
有nnn個小朋友,ccc個糖果,如果第iii個小朋友分了aaa個糖果,那么他得到的快樂值是xiax_{i}^axia?,一個幼兒園的快樂值是小朋友快樂值乘積,定義f(x1,x2,...,xn)f(x_1,x_2,...,x_n)f(x1?,x2?,...,xn?)為一個幼兒園的快樂值,現在讓你計算:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-d6J2qEfu-1645840763184)(C:\Users\Libra_Glow\AppData\Roaming\Typora\typora-user-images\image-20220226094553741.png)]
顯然考慮dpdpdp,dp[i][j][k][p]dp[i][j][k][p]dp[i][j][k][p] 表示到第iii個人,已經分了jjj個,要分給他kkk個,當前選了xi=px_i=pxi?=p,轉移方程也比較明顯dp[i][j][k][p]+=∑t=0j?k∑h=ai?1bi?1dp[i?1][j?k][t][h]dp[i][j][k][p]+=\sum_{t=0}^{j-k}\sum_{h=a_{i-1}}^{b_{i-1}}dp[i-1][j-k][t][h]dp[i][j][k][p]+=∑t=0j?k?∑h=ai?1?bi?1??dp[i?1][j?k][t][h],可以發現對于第三維和第四維我們可以使用前綴和優化掉,更進一步可以發現根本不需要存第三維和第四維,直接記dp[i][j]dp[i][j]dp[i][j]即可,預處理一下[ai,bi][a_i,b_i][ai?,bi?]的區間取某個冪次的和即可,復雜度可以降到O(n3)O(n^3)O(n3)
代碼
F - Unhappy Hacking
800800800分 dpdpdp
直接考慮dp[i][j]dp[i][j]dp[i][j]表示用了iii次操作,匹配到了第jjj位,一開始沒想出來,因為是將jjj放到了第一層循環,以長度作為dpdpdp決策的轉移,也就是考慮dp[i][j],dp[k][j?1]dp[i][j],dp[k][j-1]dp[i][j],dp[k][j?1],這樣顯然是不好搞的,考慮反過來,以操作次數作為決策點,i?1?>ii-1 -> ii?1?>i只進行了一次操作,顯然就只有三個情況,我們依次考慮:
- dp[i][j]+=dp[i?1][j?1]dp[i][j]+=dp[i-1][j-1]dp[i][j]+=dp[i?1][j?1] 當前操作打111或者000,根據第jjj位確定
- dp[i][j]+=dp[i?1][j+1]?2dp[i][j]+=dp[i-1][j+1]*2dp[i][j]+=dp[i?1][j+1]?2 當前操作選擇按回退,因為我們并不關心j+1j+1j+1位是000還是111,所以需要乘222。
注意j=0j=0j=0的時候還需要加上f[i?1][0]f[i-1][0]f[i?1][0]。
復雜度O(n2)O(n^2)O(n2)
代碼
還有一種比較巧妙的方法,可以知道長度為lenlenlen的字符串出現的概率都相等,所有情況是2len2^{len}2len,所以我們如果能求出來所有的情況,除上2len2^{len}2len即可。
設dp[i][j]dp[i][j]dp[i][j]表示用了iii次操作,長度為jjj的方案數,直接寫轉移了:
- dp[i][j]+=dp[i?1][j?1]?2dp[i][j]+=dp[i-1][j-1]*2dp[i][j]+=dp[i?1][j?1]?2 當前操作打1,01,01,0,所以需要乘222
- dp[i][j]+=dp[i?1][j+1]dp[i][j]+=dp[i-1][j+1]dp[i][j]+=dp[i?1][j+1] 按回退,由于f[i?1][j+1]f[i-1][j+1]f[i?1][j+1]的方案就已經包含了j+1j+1j+1是0,10,10,1的兩種情況,所以不需要乘222。
復雜度O(n2)O(n^2)O(n2)
代碼
總結
以上是生活随笔為你收集整理的AtCoder Regular Contest 059的全部內容,希望文章能夠幫你解決所遇到的問題。