復(fù)盤|第337場(chǎng)周賽
偶位數(shù)
【模擬】按題意模擬(注意是從右到左算)。
【二進(jìn)制模擬】題中是從低到高枚舉,&1就是取最低位。不斷取最低位,然后右移,直到等于0為止,這樣可以取到每個(gè)比特位(^=1是1-0轉(zhuǎn)換,可以避免寫ans[i%2])。
檢查騎士巡視方案
【DFS】按題意搜索。
【模擬】按題意模擬(注意判斷起點(diǎn)是否是0,0)。預(yù)處理,把每個(gè)數(shù)的坐標(biāo)用pos數(shù)組存下來(lái)。
美麗子集的數(shù)目
【回溯】在枚舉"78.子集"的基礎(chǔ)上加個(gè)判斷。在選擇x=nums的時(shí)候,如果之前選過x-k或x+k,則不能選,否則可以選。代碼實(shí)現(xiàn)時(shí),用哈希表或數(shù)組來(lái)記錄選過的數(shù),從而O(1)判斷x-k和x+k是否選過。
【DP】前置知識(shí):乘法原理和同余[如果(x-y) mod k = 0則稱x和y對(duì)模k同余,記作x≡y(mod k)],如果兩個(gè)數(shù)模k不同余則無(wú)法相差k,所以可以按照模的結(jié)果分組,每一組用哈希表/有序集合統(tǒng)計(jì)元素及其出現(xiàn)次數(shù)。每一組按照key從小到大排序后(設(shè)這些key組成了數(shù)組g),相鄰的key如果相差k,那么不能同時(shí)選。設(shè)g的大小為m??紤]最大的數(shù)g[m-1]:如果不選g[m-1],問題變成一個(gè)m-1個(gè)數(shù)的子問題。如果選g[m-1]:有2^c-1種方案,這里c為g[m-1]的出現(xiàn)次數(shù);如果g[m-1]-g[m-2]=k,那么g[m-2]絕對(duì)不能選,問題變成一個(gè)m-2個(gè)數(shù)的子問題。如果g[m-1]-g[m-2]!=k,那么g[m-2]可選可不選,問題變成一個(gè)m-1個(gè)數(shù)的子問題。定義f[表示考慮前i個(gè)ky的方案數(shù),可得轉(zhuǎn)移方程:如果g[i]-g[i-1]=k,那么f[i]=f[i-1]+f[i-2]·(2^c_i-1)。如果g[i]-g[i-1]!=k,那么f[i]=f[i-1]·2^c_i。
執(zhí)行操作后的最大 MEX
【貪心】前置知識(shí):同余[x≡y(mod m)相當(dāng)于x mod m + m = y mod m]。由于同一個(gè)數(shù)可以操作任意次,所以每個(gè)x=nums[i]都可以通過操作變成y,滿足x≡y(mod m)。枚舉mex,從0開始看有沒有對(duì)0模m同余的數(shù),有則把整個(gè)數(shù)通過操作變成0,否則答案是0,以此類推1,2……,n用一個(gè)哈希表統(tǒng)計(jì)(nums[i] mod m + m) mod m的個(gè)數(shù)。