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

UVa11054 Gergovia的酒交易(数学归纳法)的更多相关文章

  1. UVa11054 Gergovia的酒交易 Wine trading in Gergovia-递推

    https://vjudge.net/problem/UVA-11054 As you may know from the comic “Asterix and the Chieftain’s Shi ...

  2. 8-5 Wine trading in Gergovia Gergovia的酒交易 uva11054

    等价转换思维题 题意: 直线上有n(2<=n<=100000)个等距的村庄  每个村庄要么买酒 要么卖酒  设第i个村庄对酒的需求量为ai  绝对值小于一千  其中ai大于0表示买酒   ...

  3. UVa 11054 Gergovia的酒交易

    https://vjudge.net/problem/UVA-11054 题意:直线上有n个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai,ai>0表示买酒,ai<0 ...

  4. UVA - 11054 Wine trading in Gergovia (Gergovia 的酒交易)(贪心+模拟)

    题意:直线上有n(2<=n<=100000)个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai(-1000<=ai<=1000),其中ai>0表示买酒 ...

  5. UVA11054Gergovia的酒交易

    题意:       有n个村庄,每个村庄要么买酒要么买酒,负数是买酒,整数是买酒,题目保证所有的数字想加和为0,保证有解,然后每一个村庄往相邻的村庄运k坛酒的花费是k,问满足所有的村庄的最小花费是多少 ...

  6. BZOJ3032 七夕祭

    https://remmina.github.io/BZPRO/JudgeOnline/3032.html 题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ 今年举办了一次线 ...

  7. UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟

    题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求 ...

  8. uva11054 - Wine trading in Gergovia(等价转换,贪心法)

    这个题看上去麻烦,实际上只要想清楚就很简单.关键是要有一种等价转换的思维方式.其实题意就是个一排数,最后通过相邻的互相移动加减使得所有数都变成零,移动过程中每次都耗费相应值,让耗费的值最小.虽然从实际 ...

  9. UVA 11054 Wine trading in Gergovia(思维)

    题目链接: https://vjudge.net/problem/UVA-11054 /* 问题 输入村庄的个数n(2=<n<=100000)和n个村庄的数值,正代表买酒,负代表卖酒,k个 ...

随机推荐

  1. 42、mysql数据库(函数)

    1.mysql中提供的内置函数: (1)数学函数: 1)ROUND(x,y): 返回参数x的四舍五入的有y位小数的值.x不可转换时返回0,x为null时返回null. 2)RAND(): 返回0到1内 ...

  2. css 背景图片铺满

    body { width: 100%; height: 100%; background: url(img/loginbg.png); background-size: 100% 100%; back ...

  3. CentOS-yum安装Redis(单点)

    源文件安装(推荐安装) 在CentOS系统中,首先安装EPEL仓库,然后更新yum源: $ yum install epel-release -y $ yum update -y 然后安装Redis数 ...

  4. 《Linux基础知识及命令》系列分享专栏

    <Linux基础知识及命令>系列分享专栏 本专题详细为大家讲解了Linux入门基础知识,思路清晰,简单易懂.本专题非常适合刚刚学习Linux的小白来学习,通过学习该专题会让你由入门达到中级 ...

  5. CTF反序列化逃逸

    刷了一下CTF反序列化的题,去年没有好好了解.又补了一次PHP,害太菜了.每天看看别人的博客真的可以鼓舞人.简单记录一下两道字符串逃逸问题 推荐一个反序列化总结的很好的笔记https://www.cn ...

  6. idea本地调式tomcat源码

    前言 上篇文章中一直没搞定的tomcat源码调试终于搞明白了,p神的代码审计星球里竟然有,真的好b( ̄▽ ̄)d ,写一下过程,还有p神没提到的小坑 准备阶段 1.去官网下东西:https://tomc ...

  7. Java | 字符串缓冲区(StringBuilder)

    为什么要出现字符缓冲区 我们都知道,String类是不可变的,但是有的时候,我们要用到字符串的拼接,如果拼接的数量小的时候,还可以,但是如果拼接的数据量太大的话,内存的占用就太大了,所以这个时候再用S ...

  8. 题解 guP2421 【[NOI2002]荒岛野人】

    本题珂以转换成一个式子 即求Ci + Pi × x ≡ Cj + Pj × x (mod M) 的最小答案是否大于寿命最小值 以人数为最小值开始枚举山洞数,用扩展欧几里得计算最优答案是否大于寿命 若不 ...

  9. python 14篇 写日志

    import sys from loguru import logger # 日志级别: debug 调试信息打印日志比较详细,级别最低 # info 正常的提示信息,级别较低 # waring 警告 ...

  10. HTML元素属性及意义

    HTML属性可以给元素添加附加信息,设置的时候以 (属性名="属性值")成对出现. 属性值应该始终包括在引号内(单引号或双引号),html对大小写不敏感,所以属性和属性值也不区分大 ...