蓝桥杯2021国赛A组冰山问题:冰山模拟问题的映射统计解法
一、问题背景
题目模拟了冰山的每日变化过程:
初始有n座体积各异的冰山
每天环境温度变化x(影响所有冰山体积)
可能新增体积为y的冰山
需要计算每日冰山总体积(对998244353取模)
二、核心算法思路
三、完整代码解析(带注释)
#include <iostream> #include <map> using namespACe std; const int MOD = 998244353; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); 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); // 计算总和 long long total = 0; for (auto &[v, num] : cnt) { total = (total + v * num) % MOD; } cout << total << "\n"; } return 0; }
四、关键算法点详解
映射优化:使用map将相同体积的冰山合并处理,避免重复计算
分裂处理:当冰山体积超过k时,自动分裂为1体积的小冰山
每日更新:采用new_cnt临时map确保状态同步更新
模运算处理:在每次加法操作后立即取模,防止数值溢出
五、复杂度分析
六、实际应用场景
这种映射统计方法广泛应用于:
游戏中的粒子系统模拟
物理仿真中的质量分布计算
资源管理中的分类统计
大数据中的分桶计数
参考:蓝桥杯国赛A组冰山
原创内容 转载请注明出处