难度:β+
建议用时:20 min
实际用时:5 min
题目:??
代码:??
这题很经典很经典。
我之前用网络流的方法做了一个(按道理这题是网络流 24 题里的一个)。
然而这题是有简单(咳咳)解法的。
简单是指代码简短,但是里面的东西要花时间想一想。
题目大意是有一些村庄要买卖酒。有的只卖,有的只买。问最少的运酒花费是多少?如果把一瓶酒从一个村庄运到相邻的村庄,花费 1 元钱。
这题我乍一看还真不知道怎么处理(除了网络流暴力解法以外)。
然而看过大神的做法后,想了一点东西。
如果不看每瓶酒是怎样的运输方法(这样不好找内在联系),而是看每个村庄转手酒的数量。
会发现在每一种转运酒的方法里面,每个村庄转手酒的数量有规律。
如果有两瓶酒经过一个村庄(包括那些继续运走的和停在这个村庄的),那么这个村庄转手酒的数量就是 2。
如果一瓶酒经过两个村庄,那么它就使得这两个村庄转手酒的数量各加上一。
所以这就给了我们另一种解题的灵感。
如果换个角度,看每个村庄转手酒的数目,也可以统计出花费。
那么我们只要找到每个村庄转手酒的数目之和的最小值。
这个最小值是多少呢?
不难发现,如果以某一村庄 x 为分界线,x 左边的需求量为 q1,x 右边的需求量加上 x 本身的需求量为 q2,那么有 q1 + q2 = 0。
显然的,经手村庄 x 的酒最少要满足左边村庄的需求量 |q1|。这就是我们要的最小值。
答案就是 ∑(|qi|),qi = ∑ ai, i = 1, 2, 3, ..., i。(这里的 q 不同于上面的 q1,q2)
2018-02-03