[算法训练] vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论
vp1107Div3-①B-构造②C-贪心③D-贪心④E-组合数学+图论
https://www.wolai.com/sJYSwvVh3nCqVmKTMvYHQ9
Dashboard - Codeforces Round 1107 (Div. 3) - Codeforces
B-构造
题目
如果一个整数 的十进制表示中最多包含***两个不同的数字,那么这个整数 就是好整数。例如,整数 、 、 是好整数,而整数 、 则不是好整数。
给你一个整数 ( ),它是好的。你的任务是找出一个满足以下两个条件的整数 ( ):
- 好。
- 好。
构造
**把 x 写两遍就是 x×y,而 y 就是 **100...001
for _ in range(int(input())): x = int(input()) y = 10 ** len(str(x)) + 1 print(y)C-贪心
题目
给你一个二进制字符串 ,其中只有字符 和 。
在一次操作中,您可以执行以下操作:
- 选择 的子串 ,该子串是长度至少为 的重码 。
- 从所选子串中恰好删除一个字符。
然后将字符串的其余部分连接起来,形成新字符串 。
求任意多次(可能为零)进行此操作后,字符串 可能达到的最小长度。
如果从 删除开头的几个(可能是零个或全部)字符和结尾的几个(可能是零个或全部)字符可以得到 ,那么字符串 是字符串 的子串。
长度为 的字符串 如果在所有 中都有 ,则称该字符串为回文字符串。
贪心
设 是 中 的位置数。
如果 ,则所有字符都相等。整个字符串总是一个回文,因此我们可以反复删除字符,直到只剩下一个为止。
如果是 ,字符串正好由两个长度相等的连续字符块组成。任何长度至少为 的回文字符串都必须完全包含在其中一个字符串块中,因此每次操作都只能缩短一个字符串块,而不可能完全删除它。因此,这两个区块仍然是非空的,而可能的最小长度是 。
如果是 ,那么字符串至少有三个数据块。首先,我们可以将每个字块的长度缩减为 ,因为只要其长度至少为 ,任何相等字符的字块本身都是长度至少为 的回文。因此,我们可以假设字符串变成了交替字符串。
现在考虑一个长度至少为 的交替字符串。它的最后三个字符总是以 或 的形式出现;因此,它们构成了一个回文字符串。删除这个回文字符串的最后一个字符可以将字符串缩短 ,剩下的字符串仍然是交替的。重复这一步骤,我们可以将字符串的长度减少到 。那么整个字符串就是一个回文字符串,删除中间的字符可以得到两个相等的字符,再移动一步就可以将长度减至 。
因此,如果是 ,答案为 ,否则为 。
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-贪心
题目
给你两个数组 和 ,每个数组的长度都是 。您可以对数组 执行以下操作任意多次(包括零次):
- 选择两个索引 和 ,使得 ;
- 对于从 到 的每个索引 (包括这两个索引)、
- 设 为奇数,则设 为奇数。
- 如果 是偶数,则设 为奇数。
判断是否可以通过执行任意次数的操作使数组 等于数组 。
贪心
定义前缀和 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]:+1p[l+1]:+1-1=0p[l+2]:+1-1+1=+1- …
某些前缀和 +1,某些不变,前缀和永远不会减少
操作 [i, i+1]:
a[i] += 1,a[i+1] -= 1- 只有
p[i]增加 1,其他前缀和不变
操作 [n, n]:
a[n] += 1- 只有
p[n]增加 1
每个前缀和都可以独立增加任意多次,但不能减少!
因此,a 能变成 b 的充要条件是:
对所有 i,对所有 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-组合数学+图论
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!