直线上有\(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)

最新文章

  1. 预处理指令#pragma
  2. 转载:iOS开发之让你的应用“动”起来
  3. WLST 命令和变量
  4. AT&amp;T ASSEMBLY FOR LINUX AND MAC (SYS_FORK)
  5. [CareerCup] 8.9 An In-memory File System 内存文件系统
  6. C 语言指针怎么理解?
  7. 包装BufferedReader的readLine()输出行号
  8. PE文件结构详解(六)重定位
  9. Scroll文字滚动js
  10. 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
  11. oracle 表查询(2)
  12. 为什么ELF文件的加载地址是0x8048000
  13. MIPS台OpenWrt在系统内的路由器Rust应用程序开发
  14. linux5.8安装oracle10g过程记录,换实例一定要改profile的配置
  15. 抓包分析YY音频
  16. adb模拟操作之event
  17. tomcat7性能调优与配置(以windows版为例)
  18. JAVA并行异步编程,线程池+FutureTask
  19. JS Function类型
  20. Python中四种运行其他程序的方式

热门文章

  1. Linux文件编辑工具——VIM
  2. CentOS-yum安装Nginx
  3. Springboot:@RequestMapping注解及属性详解
  4. ctf之SusCTF2017-Crack Zip
  5. L inux系统安全及应用---暴力破解密码
  6. C语言:输出数字各个位的数字及和
  7. linux xsel命令
  8. virtualbox结合nat和host-only设置固定ip的环境
  9. Redis双写一致性与缓存更新策略
  10. P7003 [NEERC2013]Hack Protection