CF-2128 (Codeforces Round 1039, Div. 2) 题解

啃点难题

很神奇啊,AB两道题都不知道怎么过的

2128A. Recycling Center

题意重述

有 $n$ 个垃圾袋,每个垃圾袋的重量为 $a_i$。

每次行动你可以选择一个垃圾袋,将它摧毁(应该是回收掉吧?)。若其重量大于 $c$,你需要消耗 $1$ 金币;反之这个垃圾袋可以免费摧毁。同时,其他的垃圾袋重量翻倍。

输出:摧毁掉所有垃圾袋所消耗的最小金币数。

解法

思路

考虑垃圾袋中有且仅有一个可以免费摧毁的情况,那么显然应该优先摧毁这个免费的。

回到问题,有多个可以免费摧毁的话,应该优先摧毁这些垃圾袋中的哪个?应该优先摧毁最重的免费摧毁垃圾袋,因为它将会最快地变成付费垃圾袋。

这样的话,就可以通过排序解决问题。

参考代码

Submission #331279467

2128B. Deque Process

题意重述

当且仅当一个长度为 $n$ 的数组 $a$ 中存在连续的 $5$ 个数是递减或递增的时,我们定义这个数组是坏的,反之它是好的。

有一个排列 $p_1, p_2,… , p_n$,你要从这个排列的左侧或右侧移除元素,直至所有元素都被移除。

给出移除元素的方式使得移出的元素组成的数组是好的。如果有多种移除方法,输出任意一种。题目保证一定存在答案。

解法

思路

只需保证可以打断目前形成的递减或递增趋势即可。不妨假设移出元素构成的数组 $q$ 满足 $q_1 < q_2 > q_3 < q_4 > q_5 …$。

证明:在奇数轮取左右两个中较小的,则必定可以在偶数轮取到比上轮大的数,此时在偶数轮取较大的,则必定可以在奇数轮取到比上轮小的数……直到取完所有元素。

参考代码

Submission #333145898

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$。

参考代码

Submission #333148494

使用 Hugo 构建
主题 StackJimmy 设计