很神奇啊,AB两道题都不知道怎么过的
2128A. Recycling Center
题意重述
有 $n$ 个垃圾袋,每个垃圾袋的重量为 $a_i$。
每次行动你可以选择一个垃圾袋,将它摧毁(应该是回收掉吧?)。若其重量大于 $c$,你需要消耗 $1$ 金币;反之这个垃圾袋可以免费摧毁。同时,其他的垃圾袋重量翻倍。
输出:摧毁掉所有垃圾袋所消耗的最小金币数。
解法
思路
考虑垃圾袋中有且仅有一个可以免费摧毁的情况,那么显然应该优先摧毁这个免费的。
回到问题,有多个可以免费摧毁的话,应该优先摧毁这些垃圾袋中的哪个?应该优先摧毁最重的免费摧毁垃圾袋,因为它将会最快地变成付费垃圾袋。
这样的话,就可以通过排序解决问题。
参考代码
2128B. Deque Process
题意重述
当且仅当一个长度为 $n$ 的数组 $a$ 中存在连续的 $5$ 个数是递减或递增的时,我们定义这个数组是坏的,反之它是好的。
有一个排列 $p_1, p_2,… , p_n$,你要从这个排列的左侧或右侧移除元素,直至所有元素都被移除。
给出移除元素的方式使得移出的元素组成的数组是好的。如果有多种移除方法,输出任意一种。题目保证一定存在答案。
解法
思路
只需保证可以打断目前形成的递减或递增趋势即可。不妨假设移出元素构成的数组 $q$ 满足 $q_1 < q_2 > q_3 < q_4 > q_5 …$。
证明:在奇数轮取左右两个中较小的,则必定可以在偶数轮取到比上轮大的数,此时在偶数轮取较大的,则必定可以在奇数轮取到比上轮小的数……直到取完所有元素。
参考代码
2128C. Leftmost Below
题意重述
有一个长度为 $n$ 的数组 $a$,初始值为 $0$。
你可以做若干次操作,每次操作你可以选择一个大于 $min(a)$ 的数 $x$,它将加到数组中从左到右第一个小于 $x$ 的数。
请问是否可以让 $a$ 变为数组 $b$?
解法
思路
对于每个 $2 \leq i \leq n$,令 $m_i = \min(b_1, \ldots, b_{i-1})$。可以证明:当且仅当对于所有 $2 \leq i \leq n$ 满足 $b_i - m_i < m_i$ 时,可以达成 $a = b$。
充分性证明:可以从左至右构建数组 $a$。对于每个 $i$,若 $b_i < m_i$,则直接添加 $b_i$;否则,先添加 $b_i - m_i$,再添加 $m_i$。
必要性证明:假设构造 $a = b$。在每一步中,均有 $a_i \leq b_i$。考虑最后一次对 $a_i$ 进行操作的值 $x$。根据 $i$ 的定义,必有 $$a_i < x \leq \min(a_1, \ldots, a_{i - 1}) \leq \min(b_1, \ldots, b_{i-1})$$ 因此,$b_i = a_i + x \leq 2x - 1 \leq 2m_i - 1$。