贪心/最优化选做

认真学术


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 了,这个限制很多,而且似乎并不主流。

小概述,应该够了。

posted @ 2026-10-03 19:27  cyrel  阅读(7)  评论(0)    收藏  举报