C. Social Distance
题意:给定 01 串,问最多插入多少个 1 使得该串不破坏任意两个 1 距离至少 k 的性质。
思路:记录每个点右边的 1 的位置,再从左往右跑顺便记录左边 1 的位置即可。
AC代码:https://codeforces.com/contest/1367/submission/152473037
C. Team
题意:给定0的个数和1的个数。要求排列这些 01 使得:没有两个连续的 0,且没有两个连续的 1 。如果无解则输出-1。
思路:对于一定数量的 1 ,我们让 0 尽量少,形式如 11011011011…;我们让 0 尽量多,形式如 0101010101…。即可判断解的存在性。存在解构造即可。
AC代码:https://codeforces.com/contest/401/submission/152479413
C. Omkar and Baseball
题意:有 n 个数 1~n ,你可以选择一个区间使其变化任意位置,但是在这个区间内所有数必须换位置,现要求所有数回到自己位置问最少几次操作数 。
思路:先从终点研究,如果对升序排列的 [1,n] 操作一次,那么排列必然是完全错位的。如果选择某个子区间操作,那么子区间排列是完全错位的,两端元素位于原位。
我们知道,可以通过至多一次操作使得 [1,n] 排列完全错位,那么可以再操作一次使得排列升序,那么答案的上限就是 2 。
剔除两端位于原位的元素,对中间这个区间操作:判断是否完全错位,是则操作 1 次,否则操作 2 次(完全错位然后恢复升序)。
AC代码:https://codeforces.com/contest/1372/submission/152480447
C. Phoenix and Distribution
题意:将长度为 n n n 的无序字符串拆分为 k k k 个非空子序列( k ≤ n k≤n k≤n),使得最大字典序最小。
题解:#638 (Div. 2)C. Phoenix and Distribution(分类讨论)
思路:首先了解一下字符分配的字符串的字典序性质:给你一个可重字符集合,问拆分成若干个字符串的最大字典序最小是什么。如果字符集合只有一种字符,那么均摊为长度为 1 的字符串最优,因为把任意两个字符拼起来都会使最大字典序变大。如果字符集合有至少两种字符,那么拼接为一个升序字符串最优,因为对于升序字符串,如果在某位置插入和左边或右边相同的字符,那么字典序会变小。
举几个例子:
- ‘aaaa’,拆分成 {‘aaa’, ‘a’},如果把 ‘a’ 插入,那么 ‘aaa’ -> ‘aaaa’ 字典序会变大。
- ‘aaabb’, 拆分成 {‘aabb’, ‘a’},如果把 ‘a’ 插入,那么 ‘aabb’ -> ‘aaabb’ 字典序会变小。
那么这一题,首先从小到大均摊 k 个字符,如果 k 个字符不一样,那么最后一个字符就是答案,因为剩下的字符可以放到前面的字符串上。如果都一样,那么就转化成了字符分配的字符串的字典序问题了。
AC代码:https://codeforces.com/contest/1348/submission/152576547
F. Spy-string
水题,略。
AC代码:https://codeforces.com/contest/1360/submission/152570946