柱状图储水问题

部署运行你感兴趣的模型镜像
题目:

给定一个数组,每个位置的值代表一个高度,那么整个数组可以看做是一个直方图,

如果把这个直方图当作容器的话,求这个容器能装多少水

例如:3,1,2,4

代表第一个位置高度为3,第二个位置高度为1,以此类推,这个直方图能装3格水。如图红色地方:


思路:很多人会误想到正出什么波峰波谷,这就从开始就错了,比如两个相邻的波峰之外还有更大的波峰,这么说来你中间这连个波峰波谷算的值多白算了,这个用直接点的想法来做就可以了,就找当前i位置上能装多少水,就是从i位置向前和后遍历,找到前后max值较小的减去当前i位置的值就是能装的水,当然要是前或后没找到i位置小的,那么就不能装水(给你5分钟画图理解下这个思想)。思路有了,考虑解法:

1、暴力解法,每个i位置,都前后遍历,这个方法的时间复杂度为O(n2),

2,空间换时间,预处理数组,在找i之前,定义一个0-i位置最大大值数组,做法就是右滑数组,再定义一个i-length-1的最大是数组,做法就是左滑数组,然后找i上能装的水时,不用前后找,只需要查表就可以,这个时间复杂度为O(n),空间复杂度为O(n)。

3、时间复杂度为O(n),空间复杂度为O(1),厉害了这个,想不想听,想不想学,定义一个左指针,指向第二个元素,一个有指针,指向倒数第二个元素,因为一个和最后一个肯定不能储水,设置左边最大值为arr[0],右边最大值为arr[arr.length-1],只需要判断左边最大值与右边最大值即可,当左边最大值小于右边最大值,左指针右滑,左指针位置上能装的水就是左边对大值减去左指针指的值,若左指针指向的值大于左边大值,就不减,说明不能储水,更新左边最大值,当右边最大值小于左边最大值时,右指针左滑,做法跟前类似,直到左指针小于等于有指针跳出循环。反正就一句话,哪边小那边指针移动,给你5分钟想想,我上代码了:

public static int getWater(int[] arr){
        if (arr == null || arr.length < 3) {
            return 0;
        }
        int value = 0;
        int leftMax = arr[0];
        int rightMax = arr[arr.length - 1];
        int l = 1;
        int r = arr.length - 2;
        while (l <= r) {
            if (leftMax <= rightMax) {
                value += Math.max(0, leftMax - arr[l]);
                leftMax = Math.max(leftMax, arr[l++]);
            } else {
                value += Math.max(0, rightMax - arr[r]);
                rightMax = Math.max(rightMax, arr[r--]);
            }
        }
        return value;
    }






您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

D题 农业灌溉系统优化 农业生产中,水资源管理对作物生长至关重要。智能灌溉系统利用传感器和 数据分析来优化水资源的使用。然而,如何在多种土壤类型和动态天气条件下高 效配置这些系统,并且根据实时数据做出快速调整,是一个复杂的挑战。特别是 在面对不同作物、变化的气象条件和土壤湿度时,优化策略需要考虑多种动态因 素。 某农场占地面积 1 公顷,农场为正方形,且依河而建(如图 1),种植了不 同作物(如表 1),农场除本身拥有的储水罐以外,附近还有一条河流,如需引 水则需要建设饮水管道, 该农场自5 月 1 日起同时播种三种作物。 图 1 作物种植分布 表 1 不同作物种植表 作物 耕地面积 (公顷) 播种期需水量 (L/m2) 开花期需水 量(L/m2) 成熟期需水 量(L/m2) 播种期时 间(天) 开花期时 间(天) 高粱 0.5 5 10 8 20 50 玉米 0.3 6 12 10 32 50 大豆 0.2 4 8 6 40 40 *注:需水量是指在满足最低土壤湿度的基础上,作物生长较好还需求的灌 溉量(供给作物吸收),保持最低土壤湿度只能保证作物存活。 农业灌溉系统有“平时用河水,旱时用储水 ”的说法。河流引水管道的成本 会随距离非线性增长,每段水管的建设费用与水管长度和该段水管的通流量有关, 成本 C= 50L1.2 + 0.1Q1.5(L 为该段管道的长度,Q 为该段水管的 日流量),喷灌 的相邻两喷头距离≥15m,喷头喷淋半径 15m(见图 2)。此外,也可以通过储水 桶灌溉,建设储水罐时,每增加 1L 容积,储水罐成本增加 5,储水罐可覆盖以 自身为圆心半径 15m 的区域。 图 2 喷灌示意图 为探究该农场所处区域气象变化,并且给予场主一些帮助,某团队采集了一 些数据放在附件“该地土壤湿度数据.xlsx ”与“ 降水量等逐时气象数据.xls ” 中,请基于这些数据回答以下问题问题 1 农业中气象预测十分重要,建立一个预测模型,综合考虑历史气象 数据,试求解土壤湿度5cm_SM 与其他除土壤湿度以外的气象数据之间的关系, 并根据你的模型,按照表2 中给出的某天内不同小时测得的气象数据进行预测当 天土壤湿度,填写表2 放入你的论文之中。 表 2 土壤数据预测表 时间 (h) T Po P Pa U DD Ff RR R 预测的当 天湿度 5cm_SM 02 19.3 731.5 751.7 1.0 99 西 轻 风 15. 0 05 20.0 732.0 752.4 0.5 94 西 轻 6.0 南 风 08 23.4 732.8 753.2 0.8 80 西 轻 风 0 11 28.0 733.5 753.8 0.7 44 西 北 轻 风 0 问题 2 不考虑作物不同生长时期的需水量,只考虑土壤湿度,请你使用附 件中 2021- 07-01 至 2021-07-31 的数据合理规划,考虑引水管布线与储水罐容 积、位置,给出灌溉系统布线规划图,及建设的花费,在满足作物存活前提下使 得总花费最小。 问题 3 由于河流水源并不稳定,为预防旱季,储水罐必须保有应急储备水 源,该部分水源不可用于日常灌溉,在应急条件下,储水罐水源可以供给周围半 径 50m 范围喷头使用。请你在问题2 的基础上,完成以下任务: 若旱灾来临,问题 2 时间内,河流供给水量下降,只能提供在第2问你建立的引水系统总流量的80%,你的储水罐和引水管布线设计能够保证多少作物 存活?最多能保证多少作物正常生长?填写表3 并放入你的论文中。 表 3 作物存活情况表 作物 种植面积(公顷) 存活面积(公顷) 正常生长面积(公顷) 高粱 0.5 玉米 0.3 大豆 0.2 分析储水罐应具备的应急储备水源比例与旱灾概率的关系,填写表4 并 放入你的论文中。 表 4 应急水源比例与旱灾概率关系表 旱灾概率(%) 建议应急储备水源比例(%) 此比例能否保证 作物全部存活 10 30 50 80 100 问题 4 假设各作物成熟期均为 20 天,使用 2021-05-01 至 2021-07-31 数据 计算并规划不同作物每月的灌溉方案,你之前建立的系统是否能够满足灌溉需 求?如果不能,请修改系统布线,将月灌溉情况进行可视化(每种作物该月所用 水量、水量来源,若在 7 月 31 日前作物已成熟,则只规划到成熟期结束),填 写以下表5 并放入你的论文中。 表 5 灌溉安排表 日 期 作物 总灌溉量(L) 水源比例(河水/储水罐) 备注(如是否调整系统布线) 5 月 6 月 7 月 附录: 1、植物在生长期间的最低土壤湿度(5cm_SM)应保持在大于等于 0.22。 2、题目中所涉及土壤湿度为绝对湿度,是指土壤中水分的质量占土壤干重 的百分比,计算公式如下: 绝对湿度 其中:mw 是土壤中水分的质量(湿重减去干重),md 是土壤的干重。 3、单位面积土壤干重md = 1500 kg/m3。
最新发布
08-25
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值