当前位置:首页 > 牛客 > 牛客25380题解析:分层容器倒酒问题的C++解题策略与代码详解

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

3个月前 (07-05)

牛客25380题解析:分层容器倒酒问题的C++解题策略与代码详解  动态规划 第1张

一、题目解读

牛客25380题要求处理一个分层容器倒酒模拟问题:给定N层容器的初始容量,以及M次操作(查询或倒酒),需动态更新容器状态并输出结果。题目核心在于理解倒酒时的容量限制与溢出处理逻辑,属于算法中的动态模拟类问题。

二、解题思路

本题采用“分层容量动态模拟”策略:

1. 用vector存储每层容量与当前水量,实现快速读写;

2. 通过循环处理操作:查询直接输出对应层状态,倒酒时需计算剩余容量,若溢出则逐层传递;

3. 关键优化:利用“当前水量”变量减少重复计算,避免超限判断错误。

三、解题步骤

1. 初始化:读入层数N、操作数M,构建容量数组并初始化当前水量为0;

2. 操作处理循环:

○ 若op=1,直接输出指定层当前水量;

○ 若op=2,执行倒酒操作:计算目标层剩余容量,若倒酒量≤剩余容量则直接更新,否则溢出至下一层递归处理;

3. 边界控制:通过x<n确保不越界,v递减至0时终止倒酒循环。

四、代码及注释

#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false);  // 关闭同步加速输入
    cin.tie(nullptr);
    
    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层当前水量(注意索引转换)
        } else {                // 倒酒操作
            int x;
            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;
}

五、总结

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

参考:牛客28380题解

原创内容 转载请注明出处

标签: 动态规划
分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

题目重解:小A带着m元钱来到餐馆,菜单上有n道菜,每道菜都有确定的价格。现在需要计算出刚好花完m元的点菜方案总数。这个问题看似简单,但当菜品数量增多时,暴力枚举就会变得不可行,需要更高效的算法来解决。...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

一、题目解读CSP-J 2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。