DP \text{DP} DP :
B. Yaroslav and Two Strings
题意:
如果两个只包含数字且长度为 n ( 1 ≤ n ≤ 1 0 5 ) n(1\leq n\leq 10^5) n(1≤n≤105) 的字符串 s s s 和 w w w 存在两个数字 1 ≤ i , j ≤ n 1\leq i,j\leq n 1≤i,j≤n,使得 s i < w i , s j > w j s_i<w_i,s_j>w_j si<wi,sj>wj,则称 s s s 和 w w w 是不可比的。现在给定两个包含数字和问号且长度为 n n n 的字符串,问有多少种方案使得将所有问号替换成0到9的数字后两个字符串是不可比的?
思路:这种存在性的 DP ,可以将存在性与否另开一维,方便转移。
这一题定义 d p ( i , 0 / 1 , 0 / 0 ) dp(i,0/1,0/0) dp(i,0/1,0/0) 表示当前当前考虑到第 i i i 位,当前否/是存在 i i i 使得 s i < w i s_i < w_i si<wi ,当前否/是存在 i i i 使得 s i > w i s_i > w_i si>wi 。枚举转移即可。
AC代码:https://codeforces.com/contest/296/submission/180167226
D. Pawn
题意:
一个大小为 n × m ( 2 ≤ n , m ≤ 100 ) n\times m(2\leq n, m\leq 100) n×m(2≤n,m≤100) 国际象棋棋盘最底行站了一个兵。 它只有两种行动方式: 向上左或向上右走。 它可以选择从最低行哪个节点开始他的旅程。
每个格子上有 0 − 9 0-9 0−9 颗豌豆,而士兵想移动到最上一行并且积累到尽可能多的豌豆。同时,因为这个士兵必须把豌豆平均分给自己和他的 k ( 0 ≤ k ≤ 10 ) k(0\leq k\leq 10) k(0≤k≤10) 个兄弟,他所收集到的豌豆必须是 k + 1 k+1 k+1 的倍数。请找到他可以收集到的最多豌豆,并确定他的操作序列。
规定士兵不能手动扔出豌豆,并且他必须捡起所到达的每一个格子的所有豌豆。
思路:简单 DP ,但是输出有点麻烦。
AC代码:https://codeforces.com/contest/41/submission/180170105
构造题( ∗ 1700 ∼ ∗ 2000 ^*1700\sim ^*2000 ∗1700∼∗2000 ):
D. Traps
题意:
这里有 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n(1\leq n\leq 2\cdot 10^5) n(1≤n≤2⋅105) 个陷阱,你需要按照给出的顺序穿过这些陷阱,每个陷阱将会对你造成 a i a_i ai 的伤害
你有至多 k ( 1 ≤ k ≤ n ) k(1\leq k\leq n) k(1≤k≤n) 次机会跳过这些陷阱,可以避免你所跳过的陷阱给你造成的伤害,不过接下来的所有陷阱都会给你多造成 1 1 1 点伤害
跳过陷阱所造成的额外伤害会叠加,如果你当前已经跳过了 3 3 3 个陷阱,接下来的陷阱给你造成的伤害将会是 a i + 3 a_i +3 ai+3
现在需要你求出受到的最小伤害
题意:我们考虑跳过一个陷阱之后答案会减少多少,分成两个来考虑。如果不考虑跳跃之间的影响,跳过 a i ( 1 ≤ i ≤ n ) a_i(1\leq i\leq n) ai(1≤i≤n) 会减少 a i − ( n − i ) a_i-(n-i) ai−(n−i) 。额外考虑跳跃之间的影响,如果跳跃了 m m m 次,那么伤害会减少 C m 2 = m ⋅ ( m − 1 ) 2 C_m^2=\frac {m\cdot (m-1)} 2 Cm2=2m⋅(m−1) 。
AC代码:https://codeforces.com/contest/1684/submission/180173211
A. Dreamoon Likes Coloring
题意:
给定长为 n n n 的格子和 m m m 种颜色。
Dreamoon 会依次刷这 m m m 种颜色,对于第 i i i 种颜色,他会从第 p i p_i pi 格开始刷到第 p i + l i − 1 p_i+l_i-1 pi+li−1 格。 p i p_i pi 不能超过 n − l i + 1 n-l_i+1 n−li+1 或小于 1 1 1,这样会超出格子。
您的任务是找出一组 p i p_i pi,使得 Dreamoon 刷完所有颜色之后每种颜色至少出现了一次,且每个格子都被刷上了颜色。
1 ≤ m ≤ n ≤ 1 0 5 1 \leq m \leq n \leq 10^5 1≤m≤n≤105, 1 ≤ l i ≤ n 1 \leq l_i \leq n 1≤li≤n
思路:首先,1. 无重叠可以覆盖完 2. 紧贴着向左放可以放得下是两个必要条件。
然后构造的话,先把所有长度从左到右紧贴着左侧放置,然后如果右侧没有被覆盖的话,就把最后一个区间移过去;如果还不行,就把次末区间向后移致紧挨着最后一个。依此类推,知道可以覆盖整区间。
AC代码:https://codeforces.com/contest/1329/submission/180175688
C. Engineer Artem
题意:
给出一个 n × m n\times m n×m 的矩阵 a a a( 1 ≤ n , m ≤ 100 1\le n,m\le 100 1≤n,m≤100),其中 1 ≤ a i , j ≤ 1 0 9 1\le a_{i,j}\le 10^9 1≤ai,j≤109。
定义一个矩阵是合法的当且仅当没有任何两个相邻的元素是相等的(上下左右为相邻)。
你可以将矩阵中若干个元素加一,使其合法,输出最终矩阵。
形式化地,对于每个 ( i , j ) (i,j) (i,j), b i , j = a i , j b_{i,j}=a_{i,j} bi,j=ai,j 或者 b i , j = a i , j + 1 b_{i,j}=a_{i,j}+1 bi,j=ai,j+1,输出合法的 b b b 矩阵。
t t t 组数据( t ≤ 10 t\le 10 t≤10)。
思路:诈骗题。我们可以发现元素要么奇数要么偶数,我们将矩阵构造为奇偶相邻的即可。
AC代码:https://codeforces.com/contest/1438/submission/180183834
–
D. Replace by MEX
题意:
给一个序列 A A A,每次操作可以选定一个位置 p p p,令 a p = a_p= ap=这个序列的 m e x mex mex。你需要进行若干次操作,使得这个序列单调不降。操作次数不能超过 2 n 2n 2n。
n ≤ 1000 , a i ∈ [ 0 , n ] n \leq 1000,a_i \in [0,n] n≤1000,ai∈[0,n]。
思路:手玩样例,发现如果当前 m e x mex mex 满足 m e x > 0 mex>0 mex>0 ,那么可以直接赋值为 a [ m e x ] = m e x a[mex]=mex a[mex]=mex 。如果当前 m e x = 0 mex=0 mex=0 ,那么找到一个 a [ i ] ≠ i a[i]\neq i a[i]=i 的元素,将 m e x = 0 mex=0 mex=0 赋值给他,然后就能再次赋值了。
这样构造出来的序列为 [ 1 , 2 , 3 , ⋯ n ] [1,2,3,\cdots n] [1,2,3,⋯n] 。而且容易知道每次赋值 m e x > 0 mex>0 mex>0 的一定满足赋值之前 a [ m e x ] ≠ m e x a[mex]\neq mex a[mex]=mex 。
AC代码:https://codeforces.com/contest/1375/submission/180192769