题解

发布时间 2023-04-12 16:44:13作者: 御坂夏铃

calc

使用 cin 读入两个 int 和一个 char,判断即可。

step

因为可以从前面 \(K\) 个台阶走过来,所以累加前面 \(K\) 个台阶的方案数即可,时间复杂度 \(O(NK)\)

\(f_i\) 表示走到第 \(i\) 个台阶的方案数,容易发现

\[\begin{equation*}\begin{split} f_i&=\sum_{j=i-k}^{i-1}f_j\\ &=f_{i-1}+\sum_{j=i-k}^{i-2}f_j\\ &=f_{i-1}-f_{i-k-1}+\sum_{j=i-k-1}^{i-2}f_j\\ &=2\times f_{i-1}-f_{i-k-1} \end{split}\end{equation*}\]

用该递推公式即可做到 \(O(N)\)。当然也可以直接使用前缀和优化。

可以使用滚动数组将空间复杂度优化到 \(O(K)\)

color

第一档分直接暴力统计。

第二档分我们可以开一个 \(10^4\times 10^3\) 大小的二维数组,存储每种颜色糖果的出现位置,以及每种颜色糖果在某个位置后第一次出现的位置。查询时先找出该颜色糖果在区间中第一次出现的位置,再根据下标找出所需的最后一个糖果的位置,判断其是否在区间内即可。

第三档分需要用到二分查找,不做要求。

sunscreen

贪心,将奶牛按能够忍受的阳光强度最大值从小到大排序,依次选择防晒霜。

显然,如果能选那么肯定选。因为后面的奶牛上限都高于当前奶牛,但下限是未知的,所以当前奶牛能选的防晒霜只要高于后面奶牛的下限那么后面奶牛也一定能选,所以要尽可能把低的选掉,选取在当前奶牛范围内的最小值即可。