24暑排位3
Problem A
给定一个包含 \(n\) 个正整数的数组 \(a_0,a_1,…,a_{n−1}\),你可以选择任意下标 \(x\)(\(0≤x<n\))作为起始位置,并进行若干次操作:\(a_x\gets a_x-1\),之后 \(x\gets (x+1) \bmod n\)。如果操作之前数字为 \(0\),终止操作。
请问如果选择合适的 \(x\),最多可以进行多少次操作。
点击查看题解
寻找数组最小值,设为 \(m\)。则至少执行 \(nm\) 次。之后寻找最长不包含 \(m\) 的区间,设区间长度为 \(l\)。则答案是 \(nm+l\)。
1 |
|
Problem B
给定一个大小为 \(n\times n\) 的网格图,其中有 \(m\) 个网格上设有障碍物。你需要在网格边界上的点(非边角点非障碍物)上放若干个棋子。之后,每个棋子单位时间向对边边界移动 \(1\) 格。要求每个棋子不能移动到障碍物上,且不会有两个棋子在某时间重合,且棋子不能相互穿过。问最多可以放多少棋子。
点击查看题解
放四个棋子,使其相互之间连线为正方形。则这四个棋子不会相互干扰。对于对边,如果一个位置有棋子,则对边的相应位置就不能放棋子。所以,考虑正方形放法。如果 \(n\) 为奇数,正中间的点最多放一个。如图(数字表示不同的正方形编号)。
0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
1 | ||||||
2 | ||||||
0 | 0 | |||||
2 | ||||||
1 | ||||||
0 | 2 | 1 |
1 |
|
Problem C
将给定字符串替换最少个字母,使他能重排成回文串,并且多种方案输出字典序最小的方案。
点击查看题解
分别统计 26 个字母的个数,双指针从 a 和 z 开始扫,扫到两个奇数个字母就把一个大的变成小的,直至只剩一个或零个奇数个数字母。然后按字典序,每个字母放一半,奇数个也要放一半,中间可以放唯一一个奇数个字母,然后反着放。
例如 acbbbca 需要重排成 abcbcba。
1 |
|
Problem D
有一个长度为 \(n\) 的隐藏排列。
对于每个索引 \(i\),给定 \(s_i\),\(s_i\) 是第 \(i\) 个元素之前所有比第 \(i\) 个元素小的元素的和。
需要还原这个排列。
点击查看题解
反过来思考,如果给排列求 \(s_i\),那每个数会对后面所有比它大的数贡献 \(a_i\)。
然后再摸一摸样例会发现,\(s_i\) 里最右侧的 0 对应的一定是 1,而填了 1 后,其他数都会比 1 大,所以 1 对右侧所有的 \(s_i\) 贡献了 1,就可以把右侧的 \(s_i\) 全部减去 1。这样下来最右侧的 0 必定是 2,以此类推。
所以用线段树维护区间加与区间求最小值:每次找到 0 后,把这个点变成正无穷,然后把右侧所有点的值减去 \(i\),这样就能还原排列。
1 |
|