1 条题解

  • 0

    题意分析

    给定一个带隔板的水槽,水从x=0x=0处注入,每秒11单位。隔板位于奇数坐标,高度各异。求水从最左或最右隔板溢出所需时间。

    解题思路

    1. 水位模拟:水优先填满当前最低区域,无法下流时水平扩散
    2. 事件驱动:使用优先队列处理水位到达隔板顶端的时刻
    3. 边界判断:当最左(x=leftxx=\text{leftx})或最右(x=rightxx=\text{rightx})隔板溢出时终止

    实现步骤

    1. 初始化

      • 计算x=0x=0所在区间
      • 建立优先队列存储各隔板溢出事件
    2. 模拟过程

      • 取出最早溢出事件
      • 计算填满所需时间
      • 更新相邻区间水位
      • 将新溢出事件加入队列
    3. 终止条件

      • 当最左或最右隔板溢出时
      • 返回累计时间(向上取整)

    代码实现

    #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
    上传者