0%

牛客小白月赛85

概述:

  • 阅读理解,题面普遍片场(讲故事)(为什么我当初出了一道阅读理解就被dis了,这场全是。
  • A-D 都是一种:我不会 $\neq$ 我不能过。
  • 开场 50 分钟才想起来还有小白月赛,D 题思路秒了(假贪心)WA 了半小时。然后去拿了个外卖,回来意识到想假了,又想了一下过了。本来不打算写了,看到榜一 10 分钟不到秒了前三题,最后 14 分钟打算挣扎一下,结果 C 上来就 WA 了两发,直接下机。
  • 总结:不训练导致的(自从南京回来快两个月了)!
  • 碎碎念:如果这场我把题面变一下,测试数据不变,通过率绝对高好多。

A.ACCEPT

题目描述:

给一个只含 A C E P T 的字符串,问重新排列后最多几个 ACCEPT

解:

经典思路,统计五种字符的数量,按比例求最小值即可(1:2:1:1:1)

B.咕呱蛙

题目描述:

第 $i$ 层有 $i$ 个青蛙,问前 $i$ 层青蛙总数为偶数的第 $x$ 个 $i$ 是几。

解:

实际就是求数列 $a_i=\dfrac{i\times (i+1)}{2}$ 的第 $x$ 个偶数。

打表打出来发现就是 $4i-3,4i$ 是偶数。答案就是 $\lfloor\frac{n}{2}\rfloor\times 4+[n\bmod 2]\times 3$。

直接研究式子,或者考虑 $1…i$ 的奇偶性也可以。

C.得分显示

题目描述:

$a_i=\lfloor i\times x\rfloor$。求 $\max\lbrace x\rbrace$。

解:

$a_i=\lfloor i\times x\rfloor\Rightarrow x\in [\lceil\frac{a_i}{i}\rceil,\lfloor\frac{a_i+1}{i}\rfloor)$

所以其实就是 $n$ 个区间求交,左端点求 $max$,右端点求 $min$ 即可,同时又因为题目保证有解且求 $max\lbrace x\rbrace$,所以答案就是 $\min\lbrace\lfloor\frac{a_i+1}{i}\rfloor\rbrace$。

但是这个题面就把题目变得迷惑起来(引导人考虑相邻两个数之间的增量)。

从另一个角度去二分也可以。

D.阿里马马与四十大盗

题目描述:

在 $a_i=0$ 的位置可以选择回满血,并花费恢复生命值的时间,或者直接走。

在 $a_i>0$ 的位置会损失 $a_i$ 的生命,求从 $1$ 到 $n$ 的最小时间。

移动一格花费 $1$ 的时间,只能往相邻的格子移动。

解:

题目大量冗余信息。

移动的时间没用,直接在答案上 $+n-1$ 即可。因为不能往回走,$a_i$ 不会消失,时间不会变少。

一个错误的贪心:能不回血就不回血。想假的原因是贪心的滞后性。

正确的贪心:花费的时间只和起止血量和经过的 $a_i$ 之和有关。所以枚举最后一次回血的位置,算 $a_i$ 的前缀和即可。

E.烙饼

题目描述:

$n$ 张饼,第 $i$ 张饼需要 $a_i$ 的制作时间,每张饼可以分为若干次安排在 $m$ 机器上制作。求做完所有饼的最短时间。要求所有机器工作总次数不超过 $2n$。

解:

逃不过阅读理解去剥离题目的外衣。

一个容易的小结论:最短时间 $\geq$ $\max\lbrace a_i\rbrace$。

所以其实,就很迷惑行为了,有了这个结论,那么最后所有机器的工作总次数本身就是不会超过 $2n$ 的。即:这个工作次数没什么大的意义。

简单证明:

$x=\max$,若当前 $now+a_i>x$,那么 $a_i-(x-now)<now$,所以 $a_i$ 这个饼花费的时间不会超过 $x$(在两台机器上时间不会有重合)且最多只会被划分成 $2$ 段。

假设答案为 $x$,那么又是一个经典的 trick:$x$ 满足单调性。直接对 $x$ 二分即可。check 的时候只需要从前往后满了就放到下一台机器就好了。

那么出题人给出了一个巧妙一点的偏思维的做法,我觉得供参考,学习价值不如二分。

首先,最短时间也是 $\geq$ $\lceil\frac{\sum a_i}{m}\rceil$ 的,因为假设“抛开事实不谈”,仅考虑总耗时,然后分配给 $m$ 台机器,那么答案就是均分的结果。

那么结果上文的结论,再分讨一下:

  • 如果 $\max\leq \lceil\frac{\sum a_i}{m}\rceil$,那么最终的 $x$ 就是 $\lceil\frac{\sum a_i}{m}\rceil$
  • 反之就是 $\max$。

F.龙吸水

题目描述:

给出 $n$ 天的水位,魔法师可以在任意天降低任意数值的水位。求最多可以有多少天水位在要求区间内。

解:

先阅读理解。$n$ 天的水位不关心,只关心每一天的变化量,即:$a_i-a_{i-1}$(那我觉得这里出题人不说变化量纯纯是给题目加阅读理解)。

同时变化后的水位相比 $a_i$ 不会增加。

而第 $i$ 天之后的结果只跟第 $i$ 天的水位有关,这就非常适合 dp 了。

easy version:

$a_i\leq 5\times 10^3$,直接设 $dp[i][j]$ 表示仅考虑前 $i$ 个且第 $i$ 天水位为 $j$ 的答案。

转移时,因为可以用魔法,所以

$dp[i][j]$

可以由

$dp[i-1][k]+[j\geq l \land j\leq r](k\in [j-(a[i]-a[i-1]),+∞])$

转移而来。

维护一个 $dp[i]$ 的后缀 $\max$ 即可。

时间复杂度:$O(na)$

空间复杂度:$O(na)$

hard version:

hard version 主要是 $a_i$ 变大了,最直接的使用动态开点线段树,只需要支持:区间加($[l,r]+1$),后缀 $\max$ 即可。

时间复杂度:$O(n\log a_i)$

空间复杂度:$O(n\log a_i\log n)$

但是貌似卡空间。

那么把要用的值离线下来后离散化再用一般线段树维护即可。

鉴定为锻炼考验码力。