Re: [閒聊] LeetCode Weekly Contest 411

看板Marginalman作者 ( )時間1年前 (2024/08/18 17:39), 編輯推噓5(504)
留言9則, 6人參與, 1年前最新討論串1/3 (看更多)
終於有能貼出來的成績了 https://i.imgur.com/jn59rSX.png
Q1: 我寫了 sliding window 才發現 n <= 50 有點浪費時間了 Q2: 簡單的 DP, 存以 energyDrinkA 結尾和以 energyDrinkB 當下的最佳解即可 Q3: 我囉哩八縮寫了一大堆 不知道有沒有更好的解法 假如答案是 a0a1a2a3...a_{n/2}...a2a1a0 那他代表的數字是 a0*10^0 + a1*10^1 + ... 刷一遍 10^i mod k 是多少就可以知道 a_i 影響多少 接著從 a_{n/2} 開始倒著填到 a_0 (因為 a_0 越大越好) DP[i][r] 代表填到 a_i 時能達成 mod k 為 r 的最大數,則有 DP[i][r] = max_{0<=d<=9} [ DP[i+1][r-(d*b_i) mod k] 有值 ] 其中 b_i = (10^i + 10^{n-1-i}) mod k 之後就從 DP[0][0] 開始重新建出這個字串 其實我連保證有解都沒證 不過反正他沒講沒解要怎樣所以就是一定有解了(大概吧) Q4: 如果不是 query 題這題會是標準的 sliding window 一個很關鍵的觀察是 設一個函數 f(b) --> a 其中 a 是最小能使 s[a..b] 合法的 index 則 s[i..b] for a <= i <= b 是以 b 結尾的所有合法 substring 而且可以刷一遍 sliding window 建好 f 的表 對於 query (l, r) 我們要求的就變成 sum((b-max(l,f(b))+1) for b in [l..r]) 因為 f 是遞增的 可以用二分搜找出最小的 a' 使得 f(a') >= l 則要求的變成 sum((b-l+1) for b in [l..(a'-1)]) ...(1) + sum((b-f(b)+1) for b in [a'..r]) ...(2) (1) 直接乘起來 (2) 只要先算好 f 的 prefix sum 也能馬上得出來 就得出最後的答案了 體感難度 Q3 >= Q4 >>>> Q2 > Q1 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.77.61.242 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1723973970.A.842.html

08/18 17:40, 1年前 , 1F
幹 大師
08/18 17:40, 1F

08/18 17:40, 1年前 , 2F
我電腦壞了 不能玩
08/18 17:40, 2F

08/18 17:41, 1年前 , 3F
大師
08/18 17:41, 3F

08/18 17:44, 1年前 , 4F
大師
08/18 17:44, 4F

08/18 18:21, 1年前 , 5F
幹 大濕==
08/18 18:21, 5F

08/18 18:57, 1年前 , 6F
大師 第三題我是先都塞9 再根據k=1~9分別判斷 像是8是最前後
08/18 18:57, 6F

08/18 18:57, 1年前 , 7F
三位塞8, 7看mod6改最中間兩位, 6看n 奇偶改前後跟中間兩位
08/18 18:57, 7F

08/18 20:18, 1年前 , 8F
第三題我分case分好久
08/18 20:18, 8F

08/18 20:18, 1年前 , 9F
有看到solution直接mod dp做起來的
08/18 20:18, 9F
文章代碼(AID): #1cmS5IX2 (Marginalman)
文章代碼(AID): #1cmS5IX2 (Marginalman)