首页 技术 正文
技术 2022年11月6日
0 收藏 963 点赞 1,112 浏览 1280 个字

直线上有\(n\)个等距村庄,每个村庄要么买酒,要么卖酒。设第\(i\)个村庄对酒的需求为\(A_i\)(\(-1000 \leqslant A_i \leqslant 1000\)),其中\(A_i>0\)表示买酒,\(A_i<0\)表示卖酒。所有村庄供需平衡,即所有\(A_i\)之和等于0。

把\(k\)个单位的酒运到相邻村庄去需要\(k\)个单位的劳动力,问最少需要多少劳动力才能满足所有的村庄的要求。输出保证在64位带符号整数范围内。

输入输出样例

输入

5
5 -4 1 -3 1
6
-1000 -1000 -1000 1000 1000 1000
0

输出

9
9000

题解

这题可以采用数学归纳法的角度进行思考,

首先,我们先看基准情形,第\(1\)个村庄对酒的需求为\(A_i\)(可能需要买,可能需要卖)。那么,不管是买酒还是卖酒,都需要第\(1\)个村庄和第\(2 \sim n\)个村庄之间存在大小为\(|A_i|\)的酒搬运(可能酒交易的双方并不是第\(1\)个村庄和第\(2\)个村庄,但是必须经由这两个村庄)。

接下来我们开始归纳,我们设\(last_i = \sum_{j=1}^{j=i}A_j\)表示第\(1 \sim i\)个村庄对酒的总需求(可能需要买,可能需要卖)。那么,不管是买酒还是卖酒,都需要第\(i\)个村庄和第\(i+1\)个村庄之间存在大小为\(|last_i|\)的酒搬运(可能部分酒交易的双方并不是第\(i+1\)和\(i\)个村庄,但是必须经由这两个村庄)。我们用\(ans_i\)表示第\(1 \sim i\)个村庄需要的总搬运需求。

综上,\(ans_i\)的递推关系式可以表述如下:

\[\begin{equation}
ans_i = \left\{
\begin{matrix}
|A_i| , \quad i = 1 \\
ans_{i – 1} + |last_i|, \quad 1 \leqslant i \leqslant n
\end{matrix}
\right.
\end{equation}
\]

如果你觉得以上的数学式子还是过于抽象,那么可以继续看下面代入值计算的例子。我们设村庄数量为\(n=4\),村庄\(1 \sim 4\)的酒需求分别是\(-3, +4, -5, +4\),那么我们模拟算法的过程如下图所示:

可以看到,最后求得的4个村庄的总共搬运劳动力\(ans_4 = 8\)。

我们再看村庄\(1 \sim 4\)的酒需求分别是\(+3, -4, +5, -4\)的情况。由上面的推导可知,这种情况其实只是把每个村庄的买卖情况取反了,但最后的总搬运量不变。我们模拟算法的过程如下图所示:

可以看到,最后求得的4个村庄的总共搬运劳动力和上面的情况一样,仍然是\(ans_4 = 8\)。由此可得,我们的算法正确。算法的Python代码实现如下:

while True:
n = int(input())
if n == 0:
break
A = list(map(int, input().strip().split()))
ans, last = 0, 0
for i in range(n):
last += A[i]
ans += abs(last)
print(ans)
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,947
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,473
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,286
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,102
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,734
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,769