UVa11054 Gergovia的酒交易(数学归纳法)
直线上有个等距村庄,每个村庄要么买酒,要么卖酒。设第个村庄对酒的需求为(),其中表示买酒,表示卖酒。所有村庄供需平衡,即所有之和等于0。
把个单位的酒运到相邻村庄去需要个单位的劳动力,问最少需要多少劳动力才能满足所有的村庄的要求。输出保证在64位带符号整数范围内。
输入输出样例
输入
5
5 -4 1 -3 1
6
-1000 -1000 -1000 1000 1000 1000
0
输出
9
9000
题解
这题可以采用数学归纳法的角度进行思考,
首先,我们先看基准情形,第个村庄对酒的需求为(可能需要买,可能需要卖)。那么,不管是买酒还是卖酒,都需要第个村庄和第个村庄之间存在大小为的酒搬运(可能酒交易的双方并不是第个村庄和第个村庄,但是必须经由这两个村庄)。
接下来我们开始归纳,我们设表示第个村庄对酒的总需求(可能需要买,可能需要卖)。那么,不管是买酒还是卖酒,都需要第个村庄和第个村庄之间存在大小为的酒搬运(可能部分酒交易的双方并不是第和个村庄,但是必须经由这两个村庄)。我们用表示第个村庄需要的总搬运需求。
综上,的递推关系式可以表述如下:
如果你觉得以上的数学式子还是过于抽象,那么可以继续看下面代入值计算的例子。我们设村庄数量为,村庄的酒需求分别是,那么我们模拟算法的过程如下图所示:
可以看到,最后求得的4个村庄的总共搬运劳动力。
我们再看村庄的酒需求分别是的情况。由上面的推导可知,这种情况其实只是把每个村庄的买卖情况取反了,但最后的总搬运量不变。我们模拟算法的过程如下图所示:
可以看到,最后求得的4个村庄的总共搬运劳动力和上面的情况一样,仍然是。由此可得,我们的算法正确。算法的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)
数学是符号的艺术,音乐是上界的语言。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~