前四题比较水,E题写出来有BUG最后没时间调试了,赛后才AC。
A. Vasya And Password
题意
多组输入,有一个字符串,修改尽可能少的字符使得字符串中包含大写字母,小写字母和数字,保证存在修改后满足要求的字符串。
思路
先扫一遍字符串得到大写字母,小写字母和数字的数量。若均大于 0 0 0,则不修改;若两种字符的数量大于 0 0 0,则取其中一种数量大于 1 1 1的字符,取一位修改为剩下的字符,这里必然会有一种字符的数量大于 1 1 1,否则字符串长度只有 2 2 2,无法修改得到满足要求的字符串;若只有一种字符的数量大于 0 0 0,取两位分别修改为剩下的两种字符。
B. Relatively Prime Pairs
题意
对于从 l l l到 r r r的连续正整数序列,配对,保证每一对正整数的最大公约数为 1 1 1。
思路
任意相邻两个正整数的最大公约数为 1 1 1,取相邻的正整数配对即可。证明如下,对于正整数 i i i和 i + 1 i+1 i+1,由辗转相除法得 G C D ( i + 1 , i ) = G C D ( i , 1 ) = 1 GCD(i+1, i) = GCD(i, 1) = 1 GCD(i+1,i)=GCD(i,1)=1。
C. Vasya and Multisets
题意
有一个集合,若一个数仅出现了一次,则为好数。要求将这个集合分成两个集合,使得两个集合中好数的数量相等。
思路
若集合中好数的数量为偶数,则平均分配到两个集合,其它数均分配到同一个集合;若集合中好数的数量为奇数,则从其它数中取一个出现次数大于或等于 3 3 3的数,将其中一个与其余分别分配到不同的集合,那么这个数在只有一个被分配到的集合中也是好数,此时可以分配的好数总数量为偶数,平均分配即可;若集合中好数的数量为奇数,并且其它数的出现次数均小于 3 3 3,那么无法满足要求。
D. Bicolorings
题意
对 2 × n 2 \times n 2×n的格子着色,仅能着黑色或白色,问色块数为 k k k的着色方案有多少种。色块定义如下,若两个格子颜色相同且相邻,则属于同一色块;若两个格子颜色相同且所属色块相邻,则属于同一色块;否则属于不同色块。
思路
考虑动态规划,记录前
i
i
i列色块数为
j
j
j的着色方案数,并且对于当前列为黑黑,黑白,白黑,白白的着色方案数分别计数,即三维动态规划,
总存储空间为
O
(
n
×
k
×
4
)
O(n \times k \times 4)
O(n×k×4)。先确定
i
=
1
i = 1
i=1时各色块数对应的着色方案数,然后对于
i
i
i从
1
1
1到
n
−
1
n-1
n−1,
j
j
j从
1
1
1到
k
k
k,下一列着色方案数加上当前列着色方案数,往后更新着色方案数如下:
(当前列着色,下一列着色) | 当前列着色方案数 | 下一列着色方案数 |
---|---|---|
(黑黑,黑黑) | d p [ i ] [ j ] [ 0 ] dp[i][j][0] dp[i][j][0] | d p [ i + 1 ] [ j + 0 ] [ 0 ] dp[i+1][j+0][0] dp[i+1][j+0][0] |
(黑黑,黑白) | d p [ i ] [ j ] [ 0 ] dp[i][j][0] dp[i][j][0] | d p [ i + 1 ] [ j + 1 ] [ 1 ] dp[i+1][j+1][1] dp[i+1][j+1][1] |
(黑黑,白黑) | d p [ i ] [ j ] [ 0 ] dp[i][j][0] dp[i][j][0] | d p [ i + 1 ] [ j + 1 ] [ 2 ] dp[i+1][j+1][2] dp[i+1][j+1][2] |
(黑黑,白白) | d p [ i ] [ j ] [ 0 ] dp[i][j][0] dp[i][j][0] | d p [ i + 1 ] [ j + 1 ] [ 3 ] dp[i+1][j+1][3] dp[i+1][j+1][3] |
(黑白,黑黑) | d p [ i ] [ j ] [ 1 ] dp[i][j][1] dp[i][j][1] | d p [ i + 1 ] [ j + 0 ] [ 0 ] dp[i+1][j+0][0] dp[i+1][j+0][0] |
(黑白,黑白) | d p [ i ] [ j ] [ 1 ] dp[i][j][1] dp[i][j][1] | d p [ i + 1 ] [ j + 0 ] [ 1 ] dp[i+1][j+0][1] dp[i+1][j+0][1] |
(黑白,白黑) | d p [ i ] [ j ] [ 1 ] dp[i][j][1] dp[i][j][1] | d p [ i + 1 ] [ j + 2 ] [ 2 ] dp[i+1][j+2][2] dp[i+1][j+2][2] |
(黑白,白白) | d p [ i ] [ j ] [ 1 ] dp[i][j][1] dp[i][j][1] | d p [ i + 1 ] [ j + 0 ] [ 3 ] dp[i+1][j+0][3] dp[i+1][j+0][3] |
(白黑,黑黑) | d p [ i ] [ j ] [ 2 ] dp[i][j][2] dp[i][j][2] | d p [ i + 1 ] [ j + 0 ] [ 0 ] dp[i+1][j+0][0] dp[i+1][j+0][0] |
(白黑,黑白) | d p [ i ] [ j ] [ 2 ] dp[i][j][2] dp[i][j][2] | d p [ i + 1 ] [ j + 2 ] [ 1 ] dp[i+1][j+2][1] dp[i+1][j+2][1] |
(白黑,白黑) | d p [ i ] [ j ] [ 2 ] dp[i][j][2] dp[i][j][2] | d p [ i + 1 ] [ j + 0 ] [ 2 ] dp[i+1][j+0][2] dp[i+1][j+0][2] |
(白黑,白白) | d p [ i ] [ j ] [ 2 ] dp[i][j][2] dp[i][j][2] | d p [ i + 1 ] [ j + 0 ] [ 3 ] dp[i+1][j+0][3] dp[i+1][j+0][3] |
(白白,黑黑) | d p [ i ] [ j ] [ 3 ] dp[i][j][3] dp[i][j][3] | d p [ i + 1 ] [ j + 1 ] [ 0 ] dp[i+1][j+1][0] dp[i+1][j+1][0] |
(白白,黑白) | d p [ i ] [ j ] [ 3 ] dp[i][j][3] dp[i][j][3] | d p [ i + 1 ] [ j + 1 ] [ 1 ] dp[i+1][j+1][1] dp[i+1][j+1][1] |
(白白,白黑) | d p [ i ] [ j ] [ 3 ] dp[i][j][3] dp[i][j][3] | d p [ i + 1 ] [ j + 1 ] [ 2 ] dp[i+1][j+1][2] dp[i+1][j+1][2] |
(白白,白白) | d p [ i ] [ j ] [ 3 ] dp[i][j][3] dp[i][j][3] | d p [ i + 1 ] [ j + 0 ] [ 3 ] dp[i+1][j+0][3] dp[i+1][j+0][3] |
E. Vasya and Big Integers
题意
将一个数划分成一组数,划分后的数按顺序连接得到原来的数,要求这组数中的每个数都没有前导零,并且在 [ l , r ] [l, r] [l,r]之间,问划分方案有多少种。
思路
考虑动态规划,对于前 i i i个数和前 j j j个数的划分方案,若 i < j i \lt j i<j并且从第 i + 1 i+1 i+1位到第 j j j位组成的数满足条件,则前 i i i个数的每一个划分方案分别连接新的数均可以得到一种前 j j j个数的划分方案,因此 d p [ j ] = ∑ d p [ i ] dp[j] = \sum dp[i] dp[j]=∑dp[i]。对于所有满足条件的 i i i可以根据需要连接的数分成三类,若需要连接的数的位数与 l l l的位数相等,则需要与 l l l比较判断是否满足要求;若需要连接的数的位数与 r r r的位数相等,则需要与 r r r比较判断是否满足要求;若需要连接的数的位数比 l l l的位数多,比 r r r的位数少,则必然满足要求,并且可以用前缀和优化。需要注意的是,计算前缀和时,记录空串方案数为 1 1 1,并且跳过所有连接前导零的划分方案。