CESTARINE-题解

原题链接:Link

题面描述

Luka 有 \(n\) 辆卡车行驶在一条高速路上。高速路上有许多出入口。我们认为相同编号的出入口在同一位置。开进高速路后,司机会收到一张写着他入口号的单子。驶出时,驾驶员支付的通行费等于出入口号的差的绝对值。例如,如果单子上的入口 \(30\) ,然后在出口 \(12\) 退出,那么会花费 \(|30 - 12| = 18\) 元。

Luka 是一个爱贪小便宜的人。他发现即使卡车的路线并不重叠,司机们仍然可以在高速路上交换他们的单子。但是,同一辆卡车不能在同一位置的出入口进行上高速与下高速。

请你编程求出最少的通行费。

思路分析

这个题和卡车没什么关系,不要用结构体把入口和出口存在一起。这个题就是让我们把入口与出口配对,让差的绝对值的和最小。

对于入口和出口分别排序后,定义状态 \(f(i)\) 表示后 \(i\) 个入口和出口的最小的差的绝对值和。那怎么转移 \(f(i)\) 呢?我们只需要枚举后三个即可,也就是 \(f(i)\)\(f(i+1),f(i+2)\) 有关。为什么呢?

四个出入口可以拆分成 \(1 + 3\), \(2 + 2\), \(3 + 1\) ,也就是说,再次计算四个入口是没有意义的。

\(f(i)\) 初始化为 \(inf\) ,然后计算 \(i,i - 1,i - 2\) 的全排列中的最小代价 \(cost\) ,最后 \(f(i) = cost + f(i)\)

AC代码