小G的日常之接雨水 ZZULIOJ - 2400 思维 | 中途相遇

本文提供了一种解决积水问题的算法,通过两次遍历数组,分别从左到右和从右到左,计算每个位置可能积累的水量。首先,记录从左到右到达每个位置的最高高度,然后从右到左,计算最小的左右最高高度与当前位置高度的差值,即为该位置可积水的量。此外,还提供了一种中途相遇的方法,从两端开始向中间移动,比较左右两端的最大高度,根据较小的一侧更新最大高度,并累加可积水的量。

题解

题目链接
当前位置能积水只有两边都有比他高度高的柱子才行 接受的同时计算从左向右到达当前位置的最高高度
倒着扫一遍 过程中计算从右向左到达当前位置的最高高度答案为 min(左最高, 右最高) - 当前高 注意不能为负

AC代码

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 10;
int a[MAXN], l[MAXN]; //从左向右到达此位置的最高高度

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N;
	cin >> N;
	for (int i = 1; i <= N; i++)
		scanf("%d", &a[i]), l[i] = max(l[i - 1], a[i]);
	ll ans = 0;
	int mx = 0;
	for (int i = N; i >= 1; i--)
	{
		mx = max(mx, a[i]);
		ans += max(0, min(mx, l[i]) - a[i]); //左边的最高高度和右边的最高高度取最小减去当前高度
	}
	cout << ans << endl;

	return 0;
}

解法二 中途相遇

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 10;
int a[MAXN];

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N;
	cin >> N;
	for (int i = 1; i <= N; i++)
		scanf("%d", &a[i]);
	int l = 1, r = N, lm = 0, rm = 0; //左位置 右位置 左最大值 右最大值
	ll ans = 0;
	while (l <= r) //l不断向右 r不断向左
		if (lm <= rm)
		{
			lm = max(lm, a[l]); //取当前位置最大值
			ans += max(0, min(lm, rm) - a[l]); //两侧最大值减去当前高度为答案 注意不能为负
			l++; //右移
		}
		else
		{
			rm = max(rm, a[r]);
			ans += max(0, min(lm, rm) - a[r]);
			r--; //左移
		}
	cout << ans << endl;

	return 0;
}
由于文本交互限制,我将以文字描述方式呈现**双代号网络图(AOA,活动在箭线上)**的逻辑结构与关键路径,并标注节点编号和依赖关系。你可以根据此逻辑使用绘图工具(如Visio、Project或在线工具)生成图形。 --- ### **双代号网络图逻辑框架** **节点编号规则**: - 起点为节点1,终点为节点N,中间节点按逻辑顺序递增。 - 每个活动用“节点A→节点B”表示,并标注活动名称与持续时间(单位:天)。 - **关键路径**用红色标注(此处用**加粗**表示)。 --- #### **1. 施工准备阶段(第1月,30天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | A1→A2 | 项目部组建与进场 | 1 | 2 | 5 || | A1→A3 | 施工场地平整、临时设施 | 1 | 3 | 10 | **是** | | A2→A4 | 图纸会审与技术交底 | 2 | 4 | 3 | **是** | | A4→A5 | 材料设备采购与进场 | 4 | 5 | 15 | **是** | | A3→A6 | 测量放线、定位复核 | 3 | 6 | 5 || | A3→A7 | 安全文明施工布置 | 3 | 7 | 5 || | A1→A8 | 开工手续办理 | 1 | 8 | 10 || **关键路径**:A1→A3(场地平整)→A4→A5(材料采购) → 节点5(总耗时10+3+15=28天) --- #### **2. 基础与结构施工阶段(第2-5月,120天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | B5→B9 | 土方开挖与支护 | 5 | 9 | 20 | **是** | | B9→B10 | 基础混凝土施工 | 9 | 10 | 15 | **是** | | B10→B11 | 主体结构施工 | 10 | 11 | 60 | **是** | | B9→B12 | 雨水收集池施工 | 9 | 12 | 20 || | B9→B13 | 边坡支护施工 | 9 | 13 | 25 || | B11→B14 | 防雷地系统施工 | 11 | 14 | 10 | **是** | **关键路径**:B5→B9→B10→B11→B14(总耗时20+15+60+10=105天) --- #### **3. 装饰装修与室外工程阶段(第6-8月,90天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | C11→C15 | 站房内外墙装饰 | 11 | 15 | 30 | **是** | | C11→C16 | 罩棚钢结构安装 | 11 | 16 | 40 || | C15→C17 | 充电棚施工 | 15 | 17 | 20 | **是** | | C15→C18 | 室外道路、围墙、大门 | 15 | 18 | 25 || | C18→C19 | 园林绿化施工 | 18 | 19 | 15 || **关键路径**:C11→C15→C17(总耗时30+20=50天) --- #### **4. 安装工程施工阶段(第9-10月,60天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | D17→D20 | 充电桩设备安装调试 | 17 | 20 | 20 | **是** | | D14→D21 | 电气系统安装 | 14 | 21 | 25 | **是** | | D21→D22 | 工艺管道安装 | 21 | 22 | 15 | **是** | **关键路径**:D14→D21→D22(总耗时25+15=40天) --- #### **5. 系统调试与收尾阶段(第11月,30天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | E20→E23 | 各系统联合调试 | 20,22 | 23 | 15 | **是** | | E23→E24 | 设备试运行 | 23 | 24 | 10 | **是** | **关键路径**:E20→E23→E24(总耗时15+10=25天) --- #### **6. 竣工验收阶段(第12月,5天)** | 活动编号 | 活动内容 | 前驱节点 | 后继节点 | 持续时间 | 是否关键路径 | |----------|---------------------------|----------|----------|----------|--------------| | F24→F25 | 正式竣工验收 | 24 | 25 | 5 | **是** | --- ### **总关键路径** **施工准备 → 基础与结构 → 装饰装修 → 安装工程 → 系统调试 → 竣工验收** - **路径总时长**:28(准备) + 105(基础) + 50(装饰) + 40(安装) + 25(调试) + 5(验收) = **253天** - **总工期对齐**:2025-06-15 + 253天 ≈ 2026-05-20(含节假日调整) --- ### **绘图建议** 1. **工具选择**:使用 **Visio** 或 **Lucidchart** 绘制双代号网络图,按上述节点和箭头连。 2. **标注规则**: - 关键路径用红色箭头,非关键路径用黑色。 - 节点编号按顺序排列(如A1, A2, B5, B9等)。 3. **并行任务**: - 基础阶段:雨水收集池(B12)与边坡支护(B13)可并行。 - 安装阶段:电气系统(D21)与暖通空调可部分重叠。 ---
最新发布
05-16
### 如何使用 Visio 或在线工具绘制双代号网络图 #### 使用 Microsoft Visio 绘制双代号网络图 Microsoft Visio 是一种强大的可视化工具,可以用来创建各种流程图和网络图。以下是具体操作方式: 通过 Visio 的模板功能可以选择“项目管理”类别下的甘特图或网络图模板[^2]。这些模板提供了预定义的形状库,其中包括箭头、节点和其他必要的元素用于构建 AOA 图形。 对于双代号网络图(AOA),主要利用线条代表活动并标注其持续时间以及前后依赖关系。在实际操作过程中,可以通过拖拽相应图标到工作区,并设置连线属性来体现不同任务间的先后顺序及其关联性[^3]。 #### 利用在线工具 Lucidchart 创建双代号网络图 除了传统的桌面软件外,在线协作平台如Lucidchart也支持快速制作复杂的图表模型。它具有直观易懂的操作界面加上丰富的社区资源可供借鉴学习[^4]。 用户只需注册账号登录后即可访问众多现成模版之一——工程进度计划表/PERT Chart (Program Evaluation Review Technique),该选项非常适合表达基于事件驱动的任务流结构特点。另外还允许自定义样式调整字体大小颜色等等细节部分以满足个性化需求[^5]。 ```python import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() # 添加节点与边 edges = [(1, 2), (1, 3), (2, 4), (3, 4)] for edge in edges: G.add_edge(*edge) pos = nx.spring_layout(G) nx.draw_networkx_nodes(G, pos, node_size=700) nx.draw_networkx_edges(G, pos, edgelist=G.edges(), arrows=True) nx.draw_networkx_labels(G, pos) plt.show() ``` 上述 Python 脚本展示了另一种自动化生成简单有向无环图(DAG)的方法,虽然这里仅作为演示用途并未完全实现完整的双代号逻辑展示效果,但它确实能够帮助理解基本原理并通过编程手段扩展更复杂的功能[^6]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值