贪心/最优化选做
认真学术
CF13C & P4597
CF13C
容易发现是一个 dp,可以做 \(O(n^2)\)。
一个性质是终序列中的数一定会在原序列中出现。
简单证明:假设结论不成立,不成立的元素可以往原序列方向挪到一个存在的元素上,条件仍然成立,答案更小,所以结论成立。
似乎没有很好的猜结论方法,需要记住。
dp 的第二个状态 \(j\) 定义为当前最大值小于等于原序列排序后的 \(b_j\)。
\(dp_{i, j} = \min(dp_{i, j - 1}, dp_{i - 1, j} + |a_i - b_j|)\)。
P4597
but 我仍然看不明白,更好的理解方法吗?
https://chat.deepseek.com/share/ylef90luopfvex7laz
有空再整理吧,太多了。
实际上代码连判断都可以不要,直接这样写就行了:
for (int i = 1; i <= n; i++){
int x; cin >> x;
q.push(x), q.push(x);
ans += q.top() - x, q.pop();
}
这玩意似乎叫 Slope Trick?
应该能算 ad-hoc 了,这个限制很多,而且似乎并不主流。
小概述,应该够了。

浙公网安备 33010602011771号