【11.9】Codeforces 刷题

本文探讨了几道编程竞赛中的题目,涉及动态规划、棋盘问题和序列操作。介绍了如何利用DP解决字符串不可比较性问题,以及在国际象棋棋盘上最大化收集豌豆的策略。同时讲解了如何构建和优化路径以覆盖所有颜色,以及处理矩阵合法性问题的技巧。此外,还提出了在有限操作内使序列单调不降的解决方案。
摘要由CSDN通过智能技术生成

DP \text{DP} DP


B. Yaroslav and Two Strings

题意:

如果两个只包含数字且长度为 n ( 1 ≤ n ≤ 1 0 5 ) n(1\leq n\leq 10^5) n(1n105) 的字符串 s s s w w w 存在两个数字 1 ≤ i , j ≤ n 1\leq i,j\leq n 1i,jn,使得 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(2n,m100) 国际象棋棋盘最底行站了一个兵。 它只有两种行动方式: 向上左或向上右走。 它可以选择从最低行哪个节点开始他的旅程。

每个格子上有 0 − 9 0-9 09 颗豌豆,而士兵想移动到最上一行并且积累到尽可能多的豌豆。同时,因为这个士兵必须把豌豆平均分给自己和他的 k ( 0 ≤ k ≤ 10 ) k(0\leq k\leq 10) k(0k10) 个兄弟,他所收集到的豌豆必须是 k + 1 k+1 k+1 的倍数。请找到他可以收集到的最多豌豆,并确定他的操作序列。

规定士兵不能手动扔出豌豆,并且他必须捡起所到达的每一个格子的所有豌豆。

思路:简单 DP ,但是输出有点麻烦。

AC代码:https://codeforces.com/contest/41/submission/180170105


构造题( ∗ 1700 ∼ ∗ 2000 ^*1700\sim ^*2000 17002000 ):


D. Traps

题意:

这里有 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n(1\leq n\leq 2\cdot 10^5) n(1n2105) 个陷阱,你需要按照给出的顺序穿过这些陷阱,每个陷阱将会对你造成 a i a_i ai 的伤害

你有至多 k ( 1 ≤ k ≤ n ) k(1\leq k\leq n) k(1kn) 次机会跳过这些陷阱,可以避免你所跳过的陷阱给你造成的伤害,不过接下来的所有陷阱都会给你多造成 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(1in) 会减少 a i − ( n − i ) a_i-(n-i) ai(ni) 。额外考虑跳跃之间的影响,如果跳跃了 m m m 次,那么伤害会减少 C m 2 = m ⋅ ( m − 1 ) 2 C_m^2=\frac {m\cdot (m-1)} 2 Cm2=2m(m1)

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+li1 格。 p i p_i pi 不能超过 n − l i + 1 n-l_i+1 nli+1 或小于 1 1 1,这样会超出格子。

您的任务是找出一组 p i p_i pi,使得 Dreamoon 刷完所有颜色之后每种颜色至少出现了一次,且每个格子都被刷上了颜色。

1 ≤ m ≤ n ≤ 1 0 5 1 \leq m \leq n \leq 10^5 1mn105 1 ≤ l i ≤ n 1 \leq l_i \leq n 1lin

思路:首先,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 1n,m100),其中 1 ≤ a i , j ≤ 1 0 9 1\le a_{i,j}\le 10^9 1ai,j109

定义一个矩阵是合法的当且仅当没有任何两个相邻的元素是相等的(上下左右为相邻)。

你可以将矩阵中若干个元素加一,使其合法,输出最终矩阵。

形式化地,对于每个 ( 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 t10)。

思路:诈骗题。我们可以发现元素要么奇数要么偶数,我们将矩阵构造为奇偶相邻的即可。

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] n1000,ai[0,n]

题解:Replace by MEX

思路:手玩样例,发现如果当前 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值