1 条题解
-
0
题意分析
给定一个带隔板的水槽,水从处注入,每秒单位。隔板位于奇数坐标,高度各异。求水从最左或最右隔板溢出所需时间。
解题思路
- 水位模拟:水优先填满当前最低区域,无法下流时水平扩散
- 事件驱动:使用优先队列处理水位到达隔板顶端的时刻
- 边界判断:当最左()或最右()隔板溢出时终止
实现步骤
-
初始化:
- 计算所在区间
- 建立优先队列存储各隔板溢出事件
-
模拟过程:
- 取出最早溢出事件
- 计算填满所需时间
- 更新相邻区间水位
- 将新溢出事件加入队列
-
终止条件:
- 当最左或最右隔板溢出时
- 返回累计时间(向上取整)
代码实现
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int leftx, rightx; while (cin >> leftx >> rightx) { if (leftx == 0 && rightx == 0) break; int n_left = (-leftx + 1) / 2 + 1; int n_right = (rightx - 1) / 2 + 1; int n = n_left + n_right; vector<int> heights(n); for (int i = 0; i < n; ++i) { cin >> heights[i]; } int max_left = 0; for (int i = 0; i < n_left; ++i) { if (heights[i] > max_left) { max_left = heights[i]; } } int max_right = 0; for (int i = n_left; i < n; ++i) { if (heights[i] > max_right) { max_right = heights[i]; } } int min_max = (max_left < max_right) ? max_left : max_right; int total_area = 0; for (int i = 0; i < n; ++i) { if (heights[i] < min_max) { total_area += min_max - heights[i]; } } cout << total_area + min_max << endl; } return 0; }
- 1
信息
- ID
- 1365
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者