模拟
💡 核心思想
模拟就是"题目说什么你就做什么"。不涉及高深的算法,但极其考验代码实现能力和细节处理。常见的模拟题包括:按照规则操作、状态机模拟、日期计算等。
模拟题是 CSP-J 的常客。这类题的核心不是算法,而是读题和实现。我见过太多同学思路对了但代码写挂的。建议:把题目里的规则逐条列出来,写成注释,然后一条一条实现。最后一定要拿样例手跑一遍验证。
🎯 直觉理解
就像按照菜谱做菜——菜谱(题目)说先放油、再放盐、翻炒3分钟,你就照做。不需要发明创造,只需要忠实执行每一步。
📝 算法流程
- 仔细读题,提取所有规则
- 设计数据结构表示状态
- 按照规则逐步模拟
- 注意边界和特殊情况
📊 复杂度分析
| 指标 | 复杂度 |
|---|---|
| 时间 | 取决于模拟步数 |
| 空间 | 取决于状态数量 |
💻 参考实现(C++)
C++ (C++17)
#include <bits/stdc++.h>
using namespace std;
// 模拟示例:日期计算
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeap(int y) { return (y%4==0 && y%100!=0) || y%400==0; }
int main() {
int y, m, d; cin >> y >> m >> d;
// 计算 y年m月d日是该年第几天
int ans = d;
for (int i = 1; i < m; i++) {
ans += days[i];
if (i == 2 && isLeap(y)) ans++;
}
cout << ans << endl;
return 0;
}⚠️ 常见坑点
没有逐条实现题目中的每条规则
忽略特殊情况(如闰年、边界值)
变量名不清晰导致逻辑混乱
没有用样例验证就直接提交
📚 相关题目
| 题目 | 来源 | 难度 | 备注 |
|---|---|---|---|
| P1067 多项式输出 | 洛谷 | CSP-J | 纯模拟 |
| P3912 素数个数 | 洛谷 | CSP-J | 筛法模拟 |