当前位置:首页 > 蓝桥杯 > 【蓝桥杯国赛A组】冰山体积计算:动态规划与map统计的解题方案(洛谷P8767)

【蓝桥杯国赛A组】冰山体积计算:动态规划与map统计的解题方案(洛谷P8767)

20小时前

【蓝桥杯国赛A组】冰山体积计算:动态规划与map统计的解题方案(洛谷P8767) 蓝桥杯国赛 冰山体积计算 动态规划 map统计 取模运算 洛谷8767 第1张

一、题目解读

本题为2021年蓝桥杯国赛A组题目“冰山”(洛谷P8767),要求处理冰山在融化与新生成过程中的体积变化。每日存在两种操作:冰山体积按固定值x融化(体积不足x的部分视为完全融化),以及新增体积为y的新冰山。需计算每日剩余冰山的总体积,并对结果取模防止溢出。题目考察动态规划思维与高效数据结构设计。

二、解题思路

采用动态规划+map统计的核心思想:

1. 利用map存储不同体积冰山的数量(体积→数量映射),避免重复计算。

2. 每日迭代时,对现有冰山按融化规则更新体积:

    若融化后体积≤0则忽略,>k则拆分为k和剩余部分,≤k则直接记录。

    新增冰山直接累加对应体积数量。

3. 循环结束后,遍历map计算总体积并取模。

4. 时间复杂度O(n+m),空间复杂度O(k),满足比赛要求。

三、解题步骤

1. 初始化:输入n个初始冰山体积,统计至map。

2. 每日处理:

○ 按融化规则遍历现有冰山,更新新map(new_cnt)。

○ 若新增体积y>0,则新map对应项+1。

○ 交换新旧map完成状态转移。

3. 计算总和:遍历new_cnt,累加体积×数量并取模。

4. 输出当日结果,循环m天。

四、代码与注释

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

const int MOD = 998244353; // 取模常数防溢出

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // 加快IO速度

    int n, m, k; // 冰山数量、天数、最大体积限制
    cin >> n >> m >> k;
    
    map<int, long long> cnt; // 体积→数量映射

    // 初始化统计
    for (int i = 0; i < n; ++i) {
        int v;
        cin >> v;
        cnt[v]++;
    }
    
    for (int day = 0; day < m; ++day) {
        int x, y; // 融化值、新增体积
        cin >> x >> y;
        
        map<int, long long> new_cnt; // 每日新状态
        long long sum = 0; // 当日体积总和
        
        // 处理现有冰山
        for (auto &[v, num] : cnt) { // 遍历体积-数量对
            int new_v = v + x; // 融化后体积
            if (new_v <= 0) continue; // 完全融化则忽略
            
            if (new_v > k) { // 体积超限拆分
                new_cnt[k] = (new_cnt[k] + num) % MOD;
                new_cnt[1] = (new_cnt[1] + (new_v - k) * num) % MOD;
            } else { // 未超限直接记录
                new_cnt[new_v] = (new_cnt[new_v] + num) % MOD;
            }
        }
        
        // 添加新冰山
        if (y > 0) {
            new_cnt[y] = (new_cnt[y] + 1) % MOD;
        }
        
        cnt = move(new_cnt); // 状态转移
        
        // 计算总和
        for (auto &[v, num] : cnt) {
            sum = (sum + v * num) % MOD;
        }
        
        cout << sum << "\n"; // 输出当日结果
    }
    
    return 0;
}

五、总结

本题关键在于利用map动态维护冰山状态,通过拆分超限体积实现“化整为零”的统计策略。代码亮点包括:

1. 模块化处理流程(初始化→每日迭代→状态转移)。

2. 取模运算贯穿始终,确保大数计算正确性。

3. 避免显式循环遍历所有冰山,转而统计数量优化效率。

掌握此类动态规划+map组合思路,可高效解决类似区间拆分与统计问题。


原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

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

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

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

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

一、题目解读    2024年GESP(青少年软件编程能力等级考试)五级中的“武器强化”(洛谷平台题目编号B4071)是一道典型的算法优化问题。题目要求通过合理...

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

一、题目解读题目要求在一个n×m的网格中,从左上角到右下角选择一条路径,路径上的数字可重复取用,求取数之和的最大值。路径限制为仅能向右或向下移动。需注意路径的灵活性与重复取数的可能性,传统单向动态规划...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

发表评论

访客

看不清,换一张

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