前四題比較水,E題寫出來有BUG最後沒時間調試了,賽後才AC。
A. Vasya And Password
題意
多組輸入,有一個字符串,修改儘可能少的字符使得字符串中包含大寫字母,小寫字母和數字,保證存在修改後滿足要求的字符串。
思路
先掃一遍字符串得到大寫字母,小寫字母和數字的數量。若均大於0,則不修改;若兩種字符的數量大於0,則取其中一種數量大於1的字符,取一位修改爲剩下的字符,這裏必然會有一種字符的數量大於1,否則字符串長度只有2,無法修改得到滿足要求的字符串;若只有一種字符的數量大於0,取兩位分別修改爲剩下的兩種字符。
B. Relatively Prime Pairs
題意
對於從l到r的連續正整數序列,配對,保證每一對正整數的最大公約數爲1。
思路
任意相鄰兩個正整數的最大公約數爲1,取相鄰的正整數配對即可。證明如下,對於正整數i和i+1,由輾轉相除法得GCD(i+1,i)=GCD(i,1)=1。
C. Vasya and Multisets
題意
有一個集合,若一個數僅出現了一次,則爲好數。要求將這個集合分成兩個集合,使得兩個集合中好數的數量相等。
思路
若集合中好數的數量爲偶數,則平均分配到兩個集合,其它數均分配到同一個集合;若集合中好數的數量爲奇數,則從其它數中取一個出現次數大於或等於3的數,將其中一個與其餘分別分配到不同的集合,那麼這個數在只有一個被分配到的集合中也是好數,此時可以分配的好數總數量爲偶數,平均分配即可;若集合中好數的數量爲奇數,並且其它數的出現次數均小於3,那麼無法滿足要求。
D. Bicolorings
題意
對2×n的格子着色,僅能着黑色或白色,問色塊數爲k的着色方案有多少種。色塊定義如下,若兩個格子顏色相同且相鄰,則屬於同一色塊;若兩個格子顏色相同且所屬色塊相鄰,則屬於同一色塊;否則屬於不同色塊。
思路
考慮動態規劃,記錄前i列色塊數爲j的着色方案數,並且對於當前列爲黑黑,黑白,白黑,白白的着色方案數分別計數,即三維動態規劃,
總存儲空間爲O(n×k×4)。先確定i=1時各色塊數對應的着色方案數,然後對於i從1到n−1,j從1到k,下一列着色方案數加上當前列着色方案數,往後更新着色方案數如下:
(當前列着色,下一列着色) |
當前列着色方案數 |
下一列着色方案數 |
(黑黑,黑黑) |
dp[i][j][0] |
dp[i+1][j+0][0] |
(黑黑,黑白) |
dp[i][j][0] |
dp[i+1][j+1][1] |
(黑黑,白黑) |
dp[i][j][0] |
dp[i+1][j+1][2] |
(黑黑,白白) |
dp[i][j][0] |
dp[i+1][j+1][3] |
(黑白,黑黑) |
dp[i][j][1] |
dp[i+1][j+0][0] |
(黑白,黑白) |
dp[i][j][1] |
dp[i+1][j+0][1] |
(黑白,白黑) |
dp[i][j][1] |
dp[i+1][j+2][2] |
(黑白,白白) |
dp[i][j][1] |
dp[i+1][j+0][3] |
(白黑,黑黑) |
dp[i][j][2] |
dp[i+1][j+0][0] |
(白黑,黑白) |
dp[i][j][2] |
dp[i+1][j+2][1] |
(白黑,白黑) |
dp[i][j][2] |
dp[i+1][j+0][2] |
(白黑,白白) |
dp[i][j][2] |
dp[i+1][j+0][3] |
(白白,黑黑) |
dp[i][j][3] |
dp[i+1][j+1][0] |
(白白,黑白) |
dp[i][j][3] |
dp[i+1][j+1][1] |
(白白,白黑) |
dp[i][j][3] |
dp[i+1][j+1][2] |
(白白,白白) |
dp[i][j][3] |
dp[i+1][j+0][3] |
E. Vasya and Big Integers
題意
將一個數劃分成一組數,劃分後的數按順序連接得到原來的數,要求這組數中的每個數都沒有前導零,並且在[l,r]之間,問劃分方案有多少種。
思路
考慮動態規劃,對於前i個數和前j個數的劃分方案,若i<j並且從第i+1位到第j位組成的數滿足條件,則前i個數的每一個劃分方案分別連接新的數均可以得到一種前j個數的劃分方案,因此dp[j]=∑dp[i]。對於所有滿足條件的i可以根據需要連接的數分成三類,若需要連接的數的位數與l的位數相等,則需要與l比較判斷是否滿足要求;若需要連接的數的位數與r的位數相等,則需要與r比較判斷是否滿足要求;若需要連接的數的位數比l的位數多,比r的位數少,則必然滿足要求,並且可以用前綴和優化。需要注意的是,計算前綴和時,記錄空串方案數爲1,並且跳過所有連接前導零的劃分方案。