明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: landsat99

[其它] 挡墙蓄水 算法实现

[复制链接]
 楼主| 发表于 2023-2-24 17:12 | 显示全部楼层
mahuan1279 发表于 2023-2-24 10:27
根据图示,很容易得出 :图2+图3-n*H_max-图1=图1装水面积。算法确实很精妙!

赞一个
发表于 2023-2-25 22:02 | 显示全部楼层
谢谢各位的代码和 mahuan兄的图解,有趣的题目。

不过对各类算法不是很懂,问了一下儿子怎么解,他告诉我一句话:第n个挡板的蓄水值等于其左侧高度数列最大值A 和 其右侧高度数列最小值B 两者中的小值 减去n的高度值,加起来就可以。
像是奥数题。

估计原理和前面的代码也差不多。
验证了一下,好像如此:)


PY代码
  1. a = [0, 1, 5, 12, 7, 11, 3, 5, 12, 14, 16, 6, 4, 12, 9, 23, 16, 4, 13, 8, 12, 15, 7, 8, 4];s=0
  2. for i in range(1,len(a)-1):
  3.   s=s+max(min(max(a[0:i]),max(a[i+1:len(a)]))-a[i], 0)
  4. print(s)
复制代码







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-2-26 08:03 | 显示全部楼层
qjchen 发表于 2023-2-25 22:02
谢谢各位的代码和 mahuan兄的图解,有趣的题目。

不过对各类算法不是很懂,问了一下儿子怎么解,他告诉 ...

你这复杂度为O(N^2)了。图示算法为2*O(N)。
发表于 2023-2-26 12:20 | 显示全部楼层
mahuan1279 发表于 2023-2-26 08:03
你这复杂度为O(N^2)了。图示算法为2*O(N)。

谢谢指出~
我这个写法确实不好,是n^2的。
也可以写为复杂度O(n)级别的,其中这个左右max是可以存储后每个对比下的,不过代码就长了,确实没有前面的精简。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-18 18:04 , Processed in 0.381133 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表