Codeforces Round #517[CF1071]
A. Cram Time
显然,在里面的肯定是一段前缀。
先二分出最大值,找到这个前缀。
然后从大到小贪心减去即可。
1 |
|
B. Minimum path
$n\times n$ 的网格,上面有字母。从左上到右下走,每次只能往下或往右走,一条路径形成了长度为 $2n-1$ 的字符串,你可以在网格图上修改 $k$ 次,每次修改一个字母,输出最小的字典序。
显然如果 $k\geq 2n-1$ ,则答案为 $2n-1$ 个 $a$。
然后把这个字符串分成两部分,一部分是前面的 $a$,另一部分是后面的东西。
考虑贪心,设 $dp_{i,j}$ 表示走到 $(i,j)$ 最少经过多少个不是 $a$ 的网格。
那么找到 $i+j-1$ 最大的且 $dp_{i,j}\leq k$ 的 $(i,j)$,前 $i+j-1$ 个就全都是 $a$ 了。
剩下的就一个 bfs 就好了。
注意bfs时的去重,以及 $k=0$ 的情况。
时间复杂度 $O(n^2)$ 左右。
1 |
|
C. Triple Flips
打表题×1。
考虑暴力,枚举一个等差数列是否选择,然后判断。
然后你会发现,题目中的 $12$ 非常的奇怪。然后你又发现长度为 $8$ 的序列的等差数列个数就是 $12$。
暴力打表发现,所有长度为 $8$ 的情况都是可以的。
也就是说,长度小于 $8$ 的可以暴力做,长度大于 $8$ 的要通过不超过 $\frac{n}{3}$ 次操作搞成长度小于 $8$ 的就可以进行暴力了。
考虑当前区间 $[l,r]$ 左边连续的三个数,大力分类讨论:
$0**$,直接变成子问题 $[l+1,r]$ 。
$111$,操作一次 $(l,l+1,l+2)$ 。
$101$,操作一次 $(l,l+2,l+4)$。
$100$,操作一次 $(l,l+3,l+6)$。
$110$,不会。
把右边连续的三个数也考虑上,那么“不会”的情况就是 $110\cdots011$。
显然再分类一下就必定可以用两次将这六位都变成 $0$。
时间复杂度为 $O(n)$ 加上暴力的复杂度。
1 |
|
D. Familiar Operations
打表题×2。
先把数 $x$ 质因数分解:$x=\prod p_i^{a_i}$,
然后把 $a_i$ 排序,$a$ 序列相同的数归为一类。
显然有用的数的 $a$ 序列长度不会超过 $8$。
通过打表发现,有意义的 $a$ 序列不同的个数在 $1000$ 以内。
通过打表又发现 $\prod (a_i+1)$ (即约数个数)不同的种类在 $200$ 左右。
打表可以用dfs实现。
接着就把不同的 $a$ 序列看成一个点,和在序列上加一或减一后形成的序列对应的点连一条权值为 $1$ 的边。
最终结果是使得两个序列的约数个数相等。
那么枚举最后相同的约数个数是哪一类,然后求出最短距离就好了。
求最短距离用bfs即可。
1 |
|