[算法训练] vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论

1240 字
6 分钟
[算法训练] vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论

vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论#

https://www.wolai.com/sJYSwvVh3nCqVmKTMvYHQ9

Dashboard - Codeforces Round 1107 (Div. 3) - Codeforces

B-构造#

题目#

如果一个整数 nn 的十进制表示中最多包含***两个不同的数字,那么这个整数 nn 就是好整数。例如,整数 33858885886767 是好整数,而整数 12312394479447 则不是好整数。

给你一个整数 xx ( 1x<1081 \le x \lt 10^8 ),它是好的。你的任务是找出一个满足以下两个条件的整数 yy ( 2y1092 \le y \le 10^9 ):

  • yy 好。
  • x×yx \times y 好。

构造#

**把 x 写两遍就是 x×y,而 y 就是 **100...001

构造
for _ in range(int(input())):
x = int(input())
y = 10 ** len(str(x)) + 1
print(y)

C-贪心#

题目#

给你一个二进制字符串 ss ,其中只有字符 0\texttt{0}1\texttt{1}

在一次操作中,您可以执行以下操作:

  • 选择 ss 的子串 ^{\text{∗}} ,该子串是长度至少为 22 的重码 ^{\text{†}}
  • 从所选子串中恰好删除一个字符。

然后将字符串的其余部分连接起来,形成新字符串 ss

求任意多次(可能为零)进行此操作后,字符串 ss 可能达到的最小长度。

^{\text{∗}} 如果从 bb 删除开头的几个(可能是零个或全部)字符和结尾的几个(可能是零个或全部)字符可以得到 aa ,那么字符串 aa 是字符串 bb 的子串。

^{\text{†}} 长度为 mm 的字符串 aa 如果在所有 1im1 \le i \le m 中都有 ai=am+1ia_i = a_{m + 1 - i} ,则称该字符串为回文字符串。

贪心#

cciisisi+1s_i \ne s_{i+1} 的位置数。

如果 c=0c=0 ,则所有字符都相等。整个字符串总是一个回文,因此我们可以反复删除字符,直到只剩下一个为止。

如果是 c=1c=1 ,字符串正好由两个长度相等的连续字符块组成。任何长度至少为 22 的回文字符串都必须完全包含在其中一个字符串块中,因此每次操作都只能缩短一个字符串块,而不可能完全删除它。因此,这两个区块仍然是非空的,而可能的最小长度是 22

如果是 c2c\ge 2 ,那么字符串至少有三个数据块。首先,我们可以将每个字块的长度缩减为 11 ,因为只要其长度至少为 22 ,任何相等字符的字块本身都是长度至少为 22 的回文。因此,我们可以假设字符串变成了交替字符串。

现在考虑一个长度至少为 33 的交替字符串。它的最后三个字符总是以 010010101101 的形式出现;因此,它们构成了一个回文字符串。删除这个回文字符串的最后一个字符可以将字符串缩短 11 ,剩下的字符串仍然是交替的。重复这一步骤,我们可以将字符串的长度减少到 33 。那么整个字符串就是一个回文字符串,删除中间的字符可以得到两个相等的字符,再移动一步就可以将长度减至 11

因此,如果是 c=1c=1 ,答案为 22 ,否则为 11

贪心
for _ in range(int(input())):
n = int(input())
s = input().strip()
cnt = 1
for i in range(1,n):
if s[i] != s[i-1]:
cnt += 1
if cnt == 2:
print(2)
else:
print(1)

D-贪心#

题目#

给你两个数组 aabb ,每个数组的长度都是 nn 。您可以对数组 aa 执行以下操作任意多次(包括零次):

  1. 选择两个索引 llrr ,使得 1lrn1 \le l \le r \le n
  2. 对于从 llrr 的每个索引 ii (包括这两个索引)、
    • ili - l 为奇数,则设 ai:=ai1a_i := a_i - 1 为奇数。
    • 如果 ili - l 是偶数,则设 ai:=ai+1a_i := a_i + 1 为奇数。

判断是否可以通过执行任意次数的操作使数组 aa 等于数组 bb

贪心#

定义前缀和 p[i] = a[1] + a[2] + ... + a[i]

操作对前缀和的影响

对于区间 [l, r]

  • 位置 l:+1 → p[l] 到 p[n] 都 +1
  • 位置 l+1:-1 → p[l+1] 到 p[n] 都 -1
  • 位置 l+2:+1 → p[l+2] 到 p[n] 都 +1

最终效果:

  • p[l-1] 及之前:不变
  • p[l]:+1
  • p[l+1]:+1-1=0
  • p[l+2]:+1-1+1=+1

某些前缀和 +1,某些不变,前缀和永远不会减少

操作 [i, i+1]

  • a[i] += 1a[i+1] -= 1
  • 只有 p[i] 增加 1,其他前缀和不变

操作 [n, n]

  • a[n] += 1
  • 只有 p[n] 增加 1

每个前缀和都可以独立增加任意多次,但不能减少!

因此,a 能变成 b 的充要条件是:

piqipi≤qi对所有 ipiqipi≤qi对所有 i

其中 p[i] 是 a 的前缀和,q[i] 是 b 的前缀和。

贪心
for _ in range(int(input())):
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
ok = True
suma = sumb = 0
for i in range(n):
suma += a[i]
sumb += b[i]
if suma > sumb:
ok = False
break
print("YES" if ok else "NO")

E-组合数学+图论#

#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

[算法训练] vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论
http://blog.7a7a68.xyz/posts/vp1107div3-b-构造c-贪心d-贪心-e-组合数学图论/
作者
JulY
发布于
2026-07-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
JulY
愿你明日如绚丽之花.
公告
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
76
分类
4
标签
20
总字数
160,526
运行时长
0
最后活动
0 天前

目录