AtCoder Beginner Contest 440 简记
A - Octave
答案为 \(x \times 2^y\)。
B - Trifecta
结构体排序一下即可。
C - Striped Horse
有点思维的题。
涂色方案为:按照 \(w\) 个黑色 \(w\) 个白色这样交替的涂色。
我们考虑把每个除以 \(2w\) 后余数相等的所有 \(c_i\) 放在一个桶 \(t\) 里。
显然地,所有余数相等的 \(c_i\) 应该都被染了相同的颜色。
然后我们考虑把原问题转化为,在 \(t\) 中找到一个长度为 \(w\) 的区间,使得其区间和最小。这个前缀和做一下就行。
会出现区间末尾与区间开头拼起来的情况,因此我们要接一份 \(t\) 在 \(t\) 数组尾部,断环成链做。
D - Forbidden List 2
求 \(\geq x_j\) 不在列表中的第 \(y_j\) 小的整数。
这个题咋做?
不难想到先排序,然后二分做。
那么如何二分?
考虑二分答案 \(ans\),我们考虑求出 \([x, ans]\) 中符合题意的整数个数。
具体地说:
- 二分出列表中第一个 \(\geq x_j\) 的位置 \(s\)。(可用
std::lower_bound实现) - 二分出列表中第一个 \(> ans\) 的位置 \(t\)。(可用
std::upper_bound实现)
那么显然地,\([x, ans]\) 这个区间内,被列表中占有的数字就有 \(t - s\) 个了,那么这个区间内符合题意的数字个数即为 \(valid = ans - x + 1 - (t - s)\)。
如果 \(valid \geq y_j\),则缩小右边界,反之缩小所边界。
E - Cookies
说是经典套路来着,但是我没学过就是牛的。
首先将饼干的美味度 \(A\) 降序排序。
然后不难注意到最优的情况就是 \(K\) 个饼干全选最美味的饼干;次优解是将其中一个饼干拿走,换成第二好次 (p≧w≦q) 的饼干!
那么,我们考虑将一种解表示为 \(p_1, p_2, \cdots, p_n\)。
这是什么意思呢?\(p_i\) 表示第 \(i\) 种饼干选择的个数。这种解的价值为 \(\sum p_i \times A_i\)。
Therefore,我们可以用一个优先队列(按照每种解法的价值)来维护喵!
首先把最优解丢进去。
然后每次从优先队列里取出一个,并且正序遍历这种状态的 \(p_1, p_2, \cdots, p_n\)。
设当前遍历到的位置为 \(i\),那么不难想到弄一个更劣质的解出来是 \(p_i = p_i - 1\),\(p_{i + 1} = p_{i + 1} + 1\)。然后再把这个解丢进去。
这时候就有可爱的猫猫会问了,咦,我们怎么输出答案捏?
其实“每次从优先队列里取出一个”,我们取出来的就是第 \(k\) 优的答案。这是由于 bfs 的性质。于是,我们只要在每次从优先队列取出一个解的时候,输出其价值即可。
所谓宽度优先.就是每次都尝试访问同一层的节点. 如果同一层都访问完了,再访问下一层.
这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径.换言之,这条路径所包含的边数最小. —— 摘自 OI wiki
然后就做完了。

浙公网安备 33010602011771号