UVa11054 Gergovia的酒交易(数学归纳法)
直线上有\(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\)的递推关系式可以表述如下:
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的酒交易(数学归纳法)的更多相关文章
- 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 ...
- 8-5 Wine trading in Gergovia Gergovia的酒交易 uva11054
等价转换思维题 题意: 直线上有n(2<=n<=100000)个等距的村庄 每个村庄要么买酒 要么卖酒 设第i个村庄对酒的需求量为ai 绝对值小于一千 其中ai大于0表示买酒 ...
- UVa 11054 Gergovia的酒交易
https://vjudge.net/problem/UVA-11054 题意:直线上有n个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai,ai>0表示买酒,ai<0 ...
- UVA - 11054 Wine trading in Gergovia (Gergovia 的酒交易)(贪心+模拟)
题意:直线上有n(2<=n<=100000)个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai(-1000<=ai<=1000),其中ai>0表示买酒 ...
- UVA11054Gergovia的酒交易
题意: 有n个村庄,每个村庄要么买酒要么买酒,负数是买酒,整数是买酒,题目保证所有的数字想加和为0,保证有解,然后每一个村庄往相邻的村庄运k坛酒的花费是k,问满足所有的村庄的最小花费是多少 ...
- BZOJ3032 七夕祭
https://remmina.github.io/BZPRO/JudgeOnline/3032.html 题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ 今年举办了一次线 ...
- UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟
题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求 ...
- uva11054 - Wine trading in Gergovia(等价转换,贪心法)
这个题看上去麻烦,实际上只要想清楚就很简单.关键是要有一种等价转换的思维方式.其实题意就是个一排数,最后通过相邻的互相移动加减使得所有数都变成零,移动过程中每次都耗费相应值,让耗费的值最小.虽然从实际 ...
- UVA 11054 Wine trading in Gergovia(思维)
题目链接: https://vjudge.net/problem/UVA-11054 /* 问题 输入村庄的个数n(2=<n<=100000)和n个村庄的数值,正代表买酒,负代表卖酒,k个 ...
随机推荐
- 连接mysql数据库实现增删改查(一)
在python中我们通过pymysql来连接数据库,具体实现如下 ''' 连接mysql数据库 此类进行封装了一些基础的操作数据库方法 ''' import pymysql from Homework ...
- 其他:Windows10安装自带的Linux
1.首先我们要打开Windows功能 2.在这里把勾打上 3.然后打开 设置 --- 更新和安全 --- 针对开发人员 --- (选择)开发人员模式 --- 确定启动 就行了 4.打开PowerShe ...
- AOP面向切面的实现
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP ...
- PV操作的概念
PV操作:一种实现进程互斥与同步的有效方法,包含P操作与V操作. P操作:使 S=S-1 ,若 S>=0 ,则该进程继续执行,否则排入等待队列. V操作:使 S=S+1 ,若 S>0 ,唤 ...
- Spring Ioc和依赖注入
总结一下近来几天的学习,做个笔记 以下是Spring IoC相关内容: IoC(Inversion of Control):控制反转: 其主要功能可简单概述为:将 用 new 去创建实例对象,转换为让 ...
- 深度解析HashMap底层实现架构
摘要:分析Map接口的详细使用以及HashMap的底层是如何实现的? 本文分享自华为云社区<[图文并茂]深度解析HashMap高频面试及底层实现结构![奔跑吧!JAVA]>,原文作者:灰小 ...
- 小哈学Python ----XML
XML XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下: <data> <country name="Liechtenstein"> ...
- Tuleap administration 管理员页面中项目的配置页面
1) 进入Administration界面,点击[Browse All] 2) 所有的项目会在项目页面中展示出来 3)在Details后面点击按钮,选择 [go to project administ ...
- nmcli device and nmcli connection
NetworkManager是RHEL 7之后推出的有效管理网络的服务 NetworkManager通过工具nmcli来管理网卡 网卡属于物理硬件,NetworkManager属于软件层面,如何通过软 ...
- python基础之文件的读取
#文件名 txt文件的读取#文件的读取 open("文件","读写方法") with open("文件","读写方法") ...