4/20 - CPS-S 模拟

与众不同。

复盘

(具体题目信息详见后文解析)

怀着复杂的心情打开了 A,为什么是数学题。

计算模拟了一下,题目可以抽象成构造一个 \(1\)\(n\) 的排列,第 \(i\) 个数配上一个权值 \(\frac{1}{2^i}\),特别的,第 \(n\) 个值为 \(\frac{1}{2^{n - 1}}\),求最大的和。

然后这就可以贪心了,发现了直接 \(n\)\(1\) 就最优秀,直接 \(\mathcal{O} (n)\)

但是要分数取模,非常愤怒,直接跳过。

看 B,不是,什么东西?

看错题了来着。

跳过,看 C。

发现 C 可以直接 \(\mathcal O(n \log_3n)\) 预处理出所有好数,然后二分一下输出。

拿下 \(100\)

一直认为 D 是不可做题,打了 \(30\) 暴力就返回去看 A。

仔细琢磨了一下,发现 \(10^9 + 7\) 是一个质数,而分数取模好像可以直接用逆元解。

迎刃而解了啊!

恭喜你得到了 \(70\) 分(理论上是 \(80\) 分来着)。

然而我并没有看见数据范围。

  • 预估:\(80 + 100 + 100 + 30 = 310\)
  • 实际:\(70 + 100 + 100 + 30 = 300\)

挂分了呜呜呜。

解析

A

输入 \(n\),求一个排列,每次将前两个数的平均值替换成前两个数,求最后剩下的最大和。


设当前排列为 \(s\)

则答案为:

\[f(i) = \frac{s_i + f(i - 1)}{2} \]

因为每次 \(f\) 函数都要除以 \(2\),所以 \(f\) 越小越优秀。

即直接 \(s_i = i\) 是最优秀的。


\[f(i) = \frac{i + f(i - 1)}{2} \]

通过数学归纳法可知:

\[f(n) = \frac{(n - 1) \times 2 ^ {n - 1} + 1}{ 2^{n - 1} } \]

分数取模:

\[f(n) = \left [ (n - 1) \times 2 ^ {n - 1} + 1 \right ] \times \left ( 2^{n - 1} \right ) ^ {-1} \]

B

一棵树,以路径上边权最小值为路径代价,求第 \(k\) 大的两点间最大路径代价。


克鲁斯卡尔建最大生成树,每次建边都统计一共有多少条路径。

因为当前出现过的所有路径都是比当前枚举到的 \(w\) 大的。

如果在加边之前没有超过 \(k\) 条,而加完之后超过了,就证明第 \(k\) 大的代价是 \(w\)

C

所有三进制 \(1\)\(2\) 个数相同的数为郝数,求 \(\ge n\)\(m\) 个郝数。


预处理 + 二分。

posted @ 2025-06-30 17:00  Reveriean  阅读(9)  评论(0)    收藏  举报