找回密码
 立即注册
查看: 6|回复: 0

牛客25380题解析:分层容器倒酒问题的C++解题策略与代码详解

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:23
  • 打卡月天数:11
  • 打卡总奖励:152
  • 最近打卡:2025-07-15 14:27:44

27

主题

0

回帖

4509

积分

VIP会员

积分
4509
发表于 2025-7-9 11:01:40 | 显示全部楼层 |阅读模式
一、题目解读
牛客25380题要求处理一个分层容器倒酒模拟问题:给定N层容器的初始容量,以及M次操作(查询或倒酒),需动态更新容器状态并输出结果。题目核心在于理解倒酒时的容量限制与溢出处理逻辑,属于算法中的动态模拟类问题。
二、解题思路
本题采用“分层容量动态模拟”策略:
1. 用vector存储每层容量与当前水量,实现快速读写;
2. 通过循环处理操作:查询直接输出对应层状态,倒酒时需计算剩余容量,若溢出则逐层传递;
3. 关键优化:利用“当前水量”变量减少重复计算,避免超限判断错误。
三、解题步骤
1. 初始化:读入层数N、操作数M,构建容量数组并初始化当前水量为0;
2. 操作处理循环:
○ 若op=1,直接输出指定层当前水量;
○ 若op=2,执行倒酒操作:计算目标层剩余容量,若倒酒量≤剩余容量则直接更新,否则溢出至下一层递归处理;
3. 边界控制:通过x<n确保不越界,v递减至0时终止倒酒循环。
四、代码及注释
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. int main() {
  5.     ios::sync_with_stdio(false);  // 关闭同步加速输入
  6.     cin.tie(nullptr);
  7.    
  8.     int n, m;                  // 层数N,操作数M
  9.     cin >> n >> m;
  10.     vector<long long> capacity(n);   // 每层容量
  11.     vector<long long> current(n, 0); // 当前水量初始化为0

  12.     // 读取每层初始容量
  13.     for (int i = 0; i < n; ++i) {
  14.         cin >> capacity[i];
  15.     }

  16.     while (m--) {               // 处理M次操作
  17.         int op;
  18.         cin >> op;
  19.         if (op == 1) {          // 查询操作
  20.             int k;
  21.             cin >> k;
  22.             cout << current[k-1] << "\n"; // 输出k层当前水量(注意索引转换)
  23.         } else {                // 倒酒操作
  24.             int x;
  25.             long long v;
  26.             cin >> x >> v;
  27.             x--;               // 转换为0-based索引

  28.             // 从指定层开始倒酒
  29.             while (v > 0 && x < n) {
  30.                 long long available = capacity[x] - current[x];
  31.                 if (v <= available) {
  32.                     current[x] += v;
  33.                     v = 0;       // 倒完终止
  34.                 } else {
  35.                     current[x] = capacity[x]; // 装满
  36.                     v -= available;          // 剩余量溢出
  37.                     x++;                     // 处理下一层
  38.                 }
  39.             }
  40.         }
  41.     }
  42.    
  43.     return 0;
  44. }
复制代码


五、总结
该解法通过分层状态维护与精确溢出计算,实现了高效模拟。关键在于利用局部变量优化容量判断,避免全局遍历。适用于处理具有层级依赖的动态资源分配问题,可拓展至类似“流量分配”场景。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表