这次补了题,发现好多东西都不会了。
先放题目
A. Integer Diversity
题目大意
给定一个数组a
,可以对其中任意个数变为相反数 $x \rightarrow -x$ 。问最多可以有多少个不同的数。
思路
计算每个数的绝对值出现的次数。出现次数大于2的取2,0取1。求和。
代码
1 | void solve() { |
B. Mirror in the String
题目大意
题意:给定字符串,选定 $k$,使得 $s_1s_2…s_ks_ks_{k-1}…s_1$ 的字典序最小。
思路
贪心。
- 若 $s_1 = s_2$ ,显然 $s_1s_2$ 是最优解。
- 否则,取最长的一段不上升的前缀。
代码
1 | void solve() { |
C. Representative Edges
题目大意
给定数组,至少要修改几个元素,才能使得数组变为等差数列。
思路
不变的数最少是2个,直接枚举不变的2个数,计算其他位置是否可以不变,取最小。$1 \leq n \leq 70$,$O(n^3)$,能过。
代码
1 | void solve() { |
D. Keep the Average High
题目大意
给一个数组a和一个数x。要在a中选择尽可能多的数,使得任意一个长度大于1的子数组 $a_l, a_{l+1} ,…,a_r$ 满足以下条件:
- 子数组中存在某个数没有被选择
- $a_l+a_{l+1}+…+a_r \geq x \cdot (r-l+1)$
问可以选多少个。
思路
贪心。$a_l+a_{l+1}+…+a_r \geq x \cdot (r-l+1)$ 表明子数组平均值不小于$x$。所以不能取两个相邻且都小于$x$的数。
首先观察如何判断一个取法是否可行。让大于等于x的标记为x,小于的标记为y,则所有可行的取法的子数组必须满足如下模式:
- y或者没有y接着若干个x,然后接着一个y再接着若干个x…。比如yxxy,yxyxyxxy, xxy等等。
注意到:
- 如果有连续的x,则两部分可以分开判断,子数组为aaaaax xbbbbb,则只需分别判断子数组aaaax 以及xbbbbb是否合法即可。因为两个数的平均数大于等于小的一个。
- 同理yxyxyxy的情况只需分别判断每个yxy以及yx,xy是否满足条件即可。
因此要判断一个取法是否可行,则只需判断长度为2和3的子数组即可。
我们可以从头到尾贪心取,让前i个取尽量多的数,如果数目相同,则尽量让最后一个最靠前。当前位置为i,如果i - 1没取,那么当前位置就可以取,数目加1。
如果前两个值都取,则判断 a[i] + a[i - 1] + a[i - 2] ≥ 3x
以及 a[i] + a[i - 1] ≥ 2x
是否成立,如果不成立,说明有冲突,选了a[i]
就不能选择a[i - 1]
,最优肯定是选择a[i - 1]
而不是选择a[i]
。所以成立就选,不成立不选。
如果只有 a[i - 1]
被取了,a[i - 2]
没被取,则只需判断 a[i] + a[i - 1] ≥ 2x
是否成立。成立就可以选。
代码
1 | void solve() { |
E. Lexicographically Small Enough
题目大意
给定字符串 $s,t$ ,每次操作可以将 $s$ 中的相邻元素交换。问至少需要交换多少组相邻元素可以使得 $s < t$。
思路
枚举相同前缀的长度,贪心。
- 假设相同前缀已经固定,长度为 $i(0\le i \le n-1)$,那么最优的情况就是从后面选择一个小于 $t[i]$ 的字符交换过来。最优情况就是选择最近的。
- 枚举每个$i$,从0开始,要么从后面选择一个最近的小于 $t[i]$ 的字符过来,要么选择一个等于的让前缀相同。每次选择一个等于的过来,维护剩下的字符后缀(i + 1 ~ n)。这样每次移动可能要 $O(n)$ 来维护,总的复杂度需要 $O(n^2)$。我们可以使用树状数组来维护,只需记录每个位置,有多少个本来位于其后的字符启动到前面去。我们用原来的位置加上这个数就是其当前的位置。复杂度 $O(nlogn)$。
代码
1 | int n; |
F. Tricolor Triangles
题目大意
给定一个无向图,至多64个点,至多256条边。要给这些边涂上3种颜色之一,其中有些边已经有颜色,有些未涂色。要求一个涂色方案,使得任何一个构成三角形的三条边颜色要么都相同,要么各不相同。如果不存在合法的涂色方案,输出-1。
思路
三条边的颜色a,b,c满足相同或各不相同这个条件,可以转化为 $(a + b + c) \% 3 = 0$。
建立一个矩阵A,每一行表示每个三角形,每一列表示一条边。每一行有三个位置为1,表示组成这个三角形的三条边。则问题等价于一个同余线性方程$Ax \equiv b mod 3$,其中$x$为每条边的颜色,b为全0。已知 $A,b$,求 $x$。
线性同余方程可以用高斯消元求解。由于三角形的个数上界为$m\sqrt{m}$,所以总复杂度为$O(m^3 \sqrt{m})$。
后记 2021年度总结
2021也是过的一塌糊涂。回望过去,发现又是啥都没干的一年,唯一收获的证书是驾照(x。绩点始终上不去,比赛参加一场崩一场,项目做一个烂一个,最后考雅思又被西安疫情打乱。
天天在宿舍neet也不知道在干嘛。好像番也没看几部,游戏也没上分。只有偶尔刷刷题能抚慰下我焦躁的内心。然后发现好多算法、数据结构都忘了,或者只能口胡,打不出来。然后就跳过,也懒得复习,更不必说学新的算法了。
新年愿望啊,愿望是啥呢?好像啥都没有。雅思上岸?绩点飞升?感觉都随缘了,我的人生如果能一直neet下去就好了。
那就希望2022每天都能洗澡吧(x
–来自西安疫区在宿舍隔离澡堂不开已经18天没洗澡的我
Update:2022/1/2 看来愿望没实现呢,是说出来就不灵了吗:)