Codeforces 250 题目分析
附注 \(1\):由于 Codeforces 服务器故障,本题的程序时限为标称的二分之一。
附注 \(2\):若难度标记为形如 XXX/YYY
的格式且斜线前后颜色不同,则前者为作者估计,后者为洛谷标注。(吐槽:洛谷很多题目难度虚高)
题目
题目分析
A
难度:入门 / 普及−
算法标签:贪心
题目大意:给你 \(n\) 个数,然后你分成若干个子序列,要求每个子序列至多有 \(2\) 个负数,求最少的子序列数。
题解:每个子序列分 \(2\) 个负数即为正解。读者自证不难。
B
难度:普及− / 普及/提高−
算法标签:模拟
题目大意:给定若干组 IPv6 地址的缩略形式,求这些地址的完整形式。
题解:字符串处理。
IPv6 的地址缩写(基本上)遵循两条原则:
- 省略前导 \(0\);
- 连续的 \(0000\) 串用
::
代替(如1234:5678:0000:0000:0000:0000:0938:0000
\(\rightarrow\)1234:5678::938:0
),且保证::
符号最多出现一次; - 特别的,
0000:0000:0000:0000:0000:0000:0000:0000
\(\rightarrow\)::
。
因此这样处理:遍历字符串,判断每“节”(即相邻 :
及头尾之间的内容)字符数,缺的补全。若某节中没有字符则判断长度后全部输出 \(0\)。
\(1.5\) 倍经验:洛谷 P2815
C
难度:普及/提高−
算法标签:贪心
题目大意:
给出一个长度为 \(n\) 的序列,序列仅包含 \(1\) 到 \(k\) 的数字,且对于每个数字,在序列中的出现次数至少为一次。
现在请你选出一个数字,使删去数列中所有的这个数字后,相邻位置的数字是不同的个数最小。
如果答案有多个,请输出最小的一个。
题解:不难发现形如 xxxxx
的子串对答案的贡献和 x
是一样的。然后直接做就做完了。
D
难度:普及+/提高
算法标签:几何、三分、双指针
题目大意:
现在有 \(n\) 个点 \(A_i=(a,y_i)\),\(m\) 个点 \(B_i=(b,y_i')\),点 \(O=(0,0)\)。
定义 \(|XY|\) 为 \(X,Y\) 两点间欧几里得距离,最小化 \(min_{i=1}^{n}min_{j=1}^{m}(|OA_i|+|A_iB_j|+l_j)\),求对应的 \(i\),\(j\)。
题解:暴力的复杂度是 \(O(nm)\) 的。因此考虑优化。
不难发现排序后,当 \(j\) 是一个常数时,\(f(i)=|OA_i|+|A_iB_j|+l_j\) 是一个单谷函数。于是可以三分。
时间复杂度 \(O(m \text{log}_3n)\),可以通过这道题。
E
难度:普及+/提高
算法标签:暴力(?)
题目大意:
给一个怪物,然后它一开始看着右边,每一秒它会做出如下行动:
- 如果它的下面是空着的,那么它就掉下去。特别注意它的视角不变,也就是说它一开始向右看,那么掉下去也向右看。
- 否则它就往视线的方向走,如果碰到
+
它会破坏掉,然后转视角;如果是#
那么它破坏不了,但它依然会换视角。
每个操作可以看成 \(1\) 秒之内完成的。求出它下到 \(1\) 楼的时间。
题解:暴力 \(O(nm^2)\) 的会 T。可以看出某些时候它可能会重复走走过的路线。那么这种情况下考虑跳过空区间。这样复杂度就降为 \(O(nm)\) 就过了。