Educational Codeforces Round 51 Div. 2

前四题比较水,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 n1 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 &lt; 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,并且跳过所有连接前导零的划分方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值