查看: 14|回复: 0

蓝桥杯2021国赛A组冰山问题:冰山模拟问题的映射统计解法

[复制链接]
  • TA的每日心情
    擦汗
    半小时前
  • 签到天数: 37 天

    [LV.5]常住居民I

    36

    主题

    0

    回帖

    67

    积分

    注册会员

    Rank: 2

    积分
    67
    发表于 昨天 16:12 | 显示全部楼层 |阅读模式
    一、问题背景
    题目模拟了冰山的每日变化过程:
    • 初始有n座体积各异的冰山
    • 每天环境温度变化x(影响所有冰山体积)
    • 可能新增体积为y的冰山
    • 需要计算每日冰山总体积(对998244353取模)

    二、核心算法思路三、完整代码解析(带注释)
    1. #include <iostream>
    2. #include <map>
    3. using namespACe std;

    4. const int MOD = 998244353;

    5. int main() {
    6.     ios::sync_with_stdio(false);
    7.     cin.tie(nullptr);
    8.    
    9.     int n, m, k;
    10.     cin >> n >> m >> k;
    11.    
    12.     map<int, long long> cnt; // 体积->数量映射
    13.    
    14.     // 初始化统计
    15.     for (int i = 0; i < n; ++i) {
    16.         int v;
    17.         cin >> v;
    18.         cnt[v]++;
    19.     }
    20.    
    21.     for (int day = 0; day < m; ++day) {
    22.         int x, y;
    23.         cin >> x >> y;
    24.         
    25.         map<int, long long> new_cnt;
    26.         long long sum = 0;
    27.         
    28.         // 处理现有冰山
    29.         for (auto &[v, num] : cnt) {
    30.             int new_v = v + x;
    31.             if (new_v <= 0) continue;
    32.             
    33.             if (new_v > k) {
    34.                 new_cnt[k] = (new_cnt[k] + num) % MOD;
    35.                 new_cnt[1] = (new_cnt[1] + (new_v - k) * num) % MOD;
    36.             } else {
    37.                 new_cnt[new_v] = (new_cnt[new_v] + num) % MOD;
    38.             }
    39.         }
    40.         
    41.         // 添加新冰山
    42.         if (y > 0) {
    43.             new_cnt[y] = (new_cnt[y] + 1) % MOD;
    44.         }
    45.         
    46.         cnt = move(new_cnt);
    47.         
    48.         // 计算总和
    49.         long long total = 0;
    50.         for (auto &[v, num] : cnt) {
    51.             total = (total + v * num) % MOD;
    52.         }
    53.         
    54.         cout << total << "\n";
    55.     }
    56.    
    57.     return 0;
    58. }
    复制代码


    四、关键算法点详解
    • 映射优化:使用map将相同体积的冰山合并处理,避免重复计算
    • 分裂处理:当冰山体积超过k时,自动分裂为1体积的小冰山
    • 每日更新:采用new_cnt临时map确保状态同步更新
    • 模运算处理:在每次加法操作后立即取模,防止数值溢出

    五、复杂度分析
    • 时间复杂度:O(m * S) S为每日不同体积的数量
    • 空间复杂度:O(S) 存储当前冰山状态

    六、实际应用场景
    这种映射统计方法广泛应用于:
    • 游戏中的粒子系统模拟
    • 物理仿真中的质量分布计算
    • 资源管理中的分类统计
    • 大数据中的分桶计数

    来源:蓝桥杯2021国赛A组冰山问题:冰山模拟问题的映射统计解法

    回复

    使用道具 举报

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

    本版积分规则

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