AtCoder Regular Contest 060
文章目錄
- C - Tak and Cards
- D - Digit Sum
- E - Tak and Hotels
- F - Best Representation
比賽鏈接
C - Tak and Cards
Score : 300300300 points dpdpdp
基礎dpdpdp了,隨便搞搞就能過了。
設dp[i][j][k]dp[i][j][k]dp[i][j][k]表示選到了第iii個物品,當前體積是jjj,已經選擇了kkk個物品,轉移:
- f[i][j][k]+=f[i?1][j][k]f[i][j][k]+=f[i-1][j][k]f[i][j][k]+=f[i?1][j][k]
- f[i][j][k]+=f[i?1][j?v[i]][k?1]f[i][j][k]+=f[i-1][j-v[i]][k-1]f[i][j][k]+=f[i?1][j?v[i]][k?1]
之后枚舉j,k,jmodk==0j,k,j\bmod k==0j,k,jmodk==0的時候算答案即可。
復雜度O(n3)O(n^3)O(n3)
代碼
D - Digit Sum
Score : 500500500 points 根號 + 數學
差一點點就做出來了,想到根號了,還是對數學不敏感啊。。
分兩種情況考慮:
- b≤nb\le \sqrt nb≤n? 此時直接暴力算即可
- b>nb>\sqrt nb>n?此時不難發現題面中給的過程最多進行兩次,也就是說n=a0?b+a1n=a_{0}*b+a_{1}n=a0??b+a1?,s=a0+a1s=a_0+a_1s=a0?+a1?,帶入之后n?s=(b?1)?s0n-s=(b-1)*s_0n?s=(b?1)?s0?,根號枚舉n?sn-sn?s的因子算即可,注意b?1b-1b?1。
復雜度O(nlog?n)O(\sqrt n \log n)O(n?logn)
代碼
E - Tak and Hotels
Score : 700700700 points 倍增
一眼倍增啊,但是當時沒怎么想明白怎么倍增(純純的擺爛)。
跟大部分倍增不同,大部分的都是跳2j2^j2j步到哪里,這個題正好反過來,定義f[i][j]f[i][j]f[i][j]代表從iii開始花費jjj個操作最遠能跳到哪里,預處理f[i][0]f[i][0]f[i][0]的時候可以二分一下位置即可,讓后預處理fff之后查詢直接倍增即可。注意最后倍增的時候應該還需要從小到大倍增一次,這個根據每個人寫法不同而不同。
復雜度O(nlog?n+qlog?n)O(n\log n+q\log n)O(nlogn+qlogn)
代碼
F - Best Representation
Score : 900900900 points kmpkmpkmp + 猜結論
看了許久之后猜了個結論,除了全部相等之外其他的要么分成111段要么分成222段,下面簡單證明一下:
- 如果sss本身就不循環,那么只能分成一段
- 否則sss本身一定循環,那么去掉開頭的一個字母之后,剩下的串一定不循環。
所以只需要求一次kmpkmpkmp,讓后判斷循環節是否能整除當前的長度即可,第二種情況直接枚舉斷點。
所以題面1e9+71e9+71e9+7就是個幌子。。。。。
復雜度O(n)O(n)O(n)
代碼
總結
以上是生活随笔為你收集整理的AtCoder Regular Contest 060的全部內容,希望文章能夠幫你解決所遇到的問題。