当前位置: 首页 > news >正文

东方博宜24年8月-C组 - 屋顶

 本解析禁止用于商业用途

禁止在未经许可的情况下转载

本篇仅在CSDN发布

官方解析请访问24年东方博宜OJ编程月赛评讲课 - 网易云课堂

题目描述

小 A 在奥运会期间,前往巴黎观看奥运会的相关赛事。
在某项体育比赛中,他被场馆的屋顶吸引了,这个屋顶不同于普通的屋顶,在平坦的屋顶上,设计师使用特殊材料制作的边长为 1 米正方体,设计出了各种造型。
由于正方体的高矮不一,下雨时,屋顶会有一定的积水,这些积水会被保留在屋顶,用于场馆内的绿植灌溉。
下图给出了一个宽度为 8 的屋顶的截面图。在截面图中,我们可以看到,白色的方块是特殊材料制作的正方体,蓝色矩形,是下雨后,屋顶上的积水区域。图中积水区域的总面积为 9 平方米。


给定 N 个整数,分别代表宽度为 N 的屋顶,每个位置上正方体的高度,请你编程计算出,在屋顶截面图中,积水区域的最大总面积是多少?

输入

输入两行,第一行输入一个整数 N,屋顶的宽度。
第二行包含 N 个整数,表示每个位置立方体的高度。

输出

一个整数,表示积水区域的最大总面积。

样例

输入

8
2 4 0 1 2 3 0 3

输出

9

输入

7
19 13 3 20 13 8 25 

输出

41

输入

11
12 0 30 7 29 17 25 18 9 20 8 

输出

55

说明

数据范围
对于 10% 的数据,满足 1≤N≤100,每个位置的立方体高度单调递增。
对于另外 60% 的数据,满足 1≤N≤1000,每个位置的立方体高度没有明显的规律。
对于 100% 的数据,满足 3≤n≤100000 ,每个位置的立方体的高度,均在 [0,1000] 的范围内。

代码

使用双指针法来计算屋顶的积水区域面积:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int maxRainwaterTrapped(const vector<int>& heights) {int n = heights.size();if (n < 3) return 0;int left = 0, right = n - 1;int left_max = heights[left], right_max = heights[right];int water_trapped = 0;while (left < right) {if (left_max < right_max) {left++;if (heights[left] < left_max) {water_trapped += left_max - heights[left];} else {left_max = heights[left];}} else {right--;if (heights[right] < right_max) {water_trapped += right_max - heights[right];} else {right_max = heights[right];}}}return water_trapped;
}int main() {int N;cin >> N;vector<int> heights(N);for (int i = 0; i < N; ++i) {cin >> heights[i];}cout << maxRainwaterTrapped(heights) << endl;return 0;
}

解释

  1. 初始化

    • left 和 right 分别指向数组的两端。
    • left_max 和 right_max 分别初始化为数组两端的高度。
    • water_trapped 用于累计积水面积。
  2. 双指针移动

    • 比较 left_max 和 right_max,优先处理较小的那一侧。
    • 如果当前位置的高度小于 left_max 或 right_max,则可以计算积水面积。
    • 更新 left_max 或 right_max,并移动指针。
  3. 计算积水面积

    • 如果当前位置的高度小于 left_max,则积水面积为 left_max - heights[left]
    • 如果当前位置的高度小于 right_max,则积水面积为 right_max - heights[right]
  4. 输出结果

    • 最终输出 water_trapped,即积水区域的最大总面积。

这个算法的时间复杂度为 O(N),空间复杂度为 O(1),非常适合处理大规模数据。你可以将这个代码编译并运行,输入屋顶的宽度和每个位置的高度,程序会输出积水区域的最大总面积。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ | Leetcode C++题解之第328题奇偶链表
  • unity草体渲染方案 GPU Instaning
  • 数据结构(学习)2024.8.6
  • 数据库原理之多表查询——使用Mysql进行内连接和外连接
  • 【学习方法】高效学习因素 ② ( 学习动机 | 内在学习动机 | 外在学习动机 | 外在学习动机的调整方向 | 保护学习兴趣 | 高考竞争分析 )
  • 使用MailKit在.NET Core中收发邮件的完整示例
  • 『 Linux 』线程池与 POSIX 线程的封装编码实现
  • 无人机PX4飞控 | 电源系统详解与相关代码
  • Flask+LayUI开发手记(一):LayUI表格的前端数据分页展现
  • 高级java每日一道面试题-2024年8月06日-web篇-cookie,session,token有什么区别?
  • 【Material-UI】Autocomplete中的禁用选项:Disabled options
  • 基于Python的脑电图(EEG)信号分析(5)
  • Golang | Leetcode Golang题解之第312题戳气球
  • python 实现粒子群算法
  • 日志和守护进程
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Angular数据绑定机制
  • avalon2.2的VM生成过程
  • happypack两次报错的问题
  • JavaScript设计模式之工厂模式
  • KMP算法及优化
  • Laravel 实践之路: 数据库迁移与数据填充
  • python学习笔记-类对象的信息
  • sessionStorage和localStorage
  • Spark学习笔记之相关记录
  • Webpack 4 学习01(基础配置)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 聊聊flink的TableFactory
  • 前端面试之闭包
  • 我从编程教室毕业
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #if和#ifdef区别
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #数据结构 笔记三
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (0)Nginx 功能特性
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (ZT)一个美国文科博士的YardLife
  • (八)Flink Join 连接
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (接口封装)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一) 初入MySQL 【认识和部署】
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (译) 函数式 JS #1:简介
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET CORE使用Redis分布式锁续命(续期)问题