Codeforces 250 题目分析

附注 \(1\):由于 Codeforces 服务器故障,本题的程序时限标称二分之一
附注 \(2\):若难度标记为形如 XXX/YYY 的格式且斜线前后颜色不同,则前者为作者估计,后者为洛谷标注。(吐槽:洛谷很多题目难度虚高)

题目

Dashboard

题目分析

A

难度:入门 / 普及−
算法标签:贪心
题目大意:给你 \(n\) 个数,然后你分成若干个子序列,要求每个子序列至多有 \(2\) 个负数,求最少的子序列数。
题解:每个子序列分 \(2\) 个负数即为正解。读者自证不难。

B

难度:普及− / 普及/提高−
算法标签:模拟
题目大意:给定若干组 IPv6 地址的缩略形式,求这些地址的完整形式。
题解:字符串处理。
IPv6 的地址缩写(基本上)遵循两条原则:

  1. 省略前导 \(0\)
  2. 连续的 \(0000\) 串用 :: 代替(如 1234:5678:0000:0000:0000:0000:0938:0000\(\rightarrow\)1234:5678::938:0),且保证 :: 符号最多出现一次;
  3. 特别的,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\) 楼的时间。
    image

题解:暴力 \(O(nm^2)\) 的会 T。可以看出某些时候它可能会重复走走过的路线。那么这种情况下考虑跳过空区间。这样复杂度就降为 \(O(nm)\) 就过了。

posted @ 2024-11-18 09:30  cakn  阅读(79)  评论(0编辑  收藏  举报