- 打卡等级:即来则安
- 打卡总天数:21
- 打卡月天数:9
- 打卡总奖励:137
- 最近打卡:2025-07-13 16:05:00
VIP会员
- 积分
- 4500
|
一、问题背景与理解牛客25380题描述了一个有趣的分层倒酒问题:有n层容器,每层有固定容量。我们需要处理两种操作:查询某层的当前酒量,以及从指定层开始倒入一定量的酒(当一层装满后,多余酒量会自动流向下一层)。这是一个典型的模拟类问题,考验对实际问题抽象建模和流程控制的能力。 二、完整代码实现(带详细注释)- #include <iostream>
- #include <vector>
- using namespACe std;
- int main() {
- ios::sync_with_stdio(false); // 禁用C与C++的输入输出同步,提升IO速度
- cin.tie(nullptr); // 解除cin与cout的绑定,进一步提速
-
- int n, m; // n-层数,m-操作次数
- cin >> n >> m;
- vector<long long> capacity(n); // 每层的**容量
- vector<long long> current(n, 0); // 每层当前酒量,初始为0
-
- // 读取每层初始容量
- for (int i = 0; i < n; ++i) {
- cin >> capacity[i];
- }
-
- while (m--) { // 处理m个操作
- int op;
- cin >> op;
- if (op == 1) { // 查询操作
- int k;
- cin >> k;
- cout << current[k-1] << "\n"; // 输出第k层当前酒量(转换为0-based)
- } else { // 倒酒操作
- int x; // 起始层(1-based)
- long long v; // 倒酒量
- cin >> x >> v;
- x--; // 转换为0-based索引
-
- // 从指定层开始倒酒
- while (v > 0 && x < n) { // 还有酒未倒完且还有下层
- long long available = capacity[x] - current[x]; // 当前层剩余容量
- if (v <= available) { // 当前层可以容纳全部剩余酒量
- current[x] += v;
- v = 0; // 酒已倒完
- } else { // 当前层会被装满
- current[x] = capacity[x]; // 装满当前层
- v -= available; // 减去已倒入的量
- x++; // 处理下一层
- }
- }
- }
- }
-
- return 0;
- }
复制代码
三、算法核心思想模拟过程:忠实按照题目描述的物理过程进行模拟 状态维护:使用两个 数组分别记录各层的容量和当前酒量 操作处理:区分查询和倒酒两种操作类型 溢出处理:自动将多余酒量流向下一层的逻辑实现
四、关键技巧分析五、复杂度分析时间复杂度:O(m × n) 最坏情况下每次倒酒操作需要遍历所有层
六、扩展思考参考:学习资料
|
|