模拟与枚举

概念讲解

什么是模拟?

模拟是按照题目描述的过程,逐步实现代码。

什么是枚举?

枚举是列举所有可能的情况,逐一检验。

模拟题技巧

1. 仔细读题

  • 理解题目意思
  • 注意边界条件
  • 确定输入输出格式

2. 分步骤实现

1234// 例如:模拟电梯运行
// 1. 读入请求
// 2. 排序请求
// 3. 依次处理

3. 使用合适的数据结构

  • 队列:模拟排队
  • 栈:模拟撤销
  • 优先队列:模拟调度

枚举技巧

1. 暴力枚举

12345for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        // 枚举所有组合
    }
}

2. 优化枚举

  • 减少枚举范围
  • 提前终止
  • 使用数学公式

考点分析

初赛考查方式

  1. 程序阅读: 模拟程序
  2. 编程题: 模拟题

常见考点

  • 模拟程序执行
  • 暴力枚举
  • 优化技巧

例题精讲

例题 1:模拟

题目: 模拟约瑟夫环问题。

解答:

123456789101112int josephus(int n, int m) {
    queue<int> q;
    for (int i = 1; i <= n; i++) q.push(i);
    while (q.size() > 1) {
        for (int i = 0; i < m - 1; i++) {
            q.push(q.front());
            q.pop();
        }
        q.pop();
    }
    return q.front();
}

例题 2:枚举

题目: 找出 100-999 中的所有水仙花数。

解答:

123456for (int i = 100; i <= 999; i++) {
    int a = i / 100, b = i / 10 % 10, c = i % 10;
    if (a*a*a + b*b*b + c*c*c == i) {
        cout << i << endl;
    }
}

练习题

  1. 模拟题的关键是什么?
查看答案

模拟题的关键是:

  1. 仔细读题:理解题目描述的过程
  2. 分步骤实现:将复杂过程分解为简单步骤
  3. 注意边界条件:处理特殊情况
  4. 使用合适的数据结构:队列、栈、优先队列等
  1. 如何优化枚举?
查看答案

优化枚举的方法:

  1. 减少枚举范围:利用数学性质缩小范围
  2. 提前终止:找到答案后立即退出
  3. 使用数学公式:避免不必要的计算
  4. 剪枝:跳过不可能的情况
  1. 水仙花数有哪些?
查看答案

三位数的水仙花数有:

  • 153:13+53+33=1+125+27=1531^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
  • 370:33+73+03=27+343+0=3703^3 + 7^3 + 0^3 = 27 + 343 + 0 = 370
  • 371:33+73+13=27+343+1=3713^3 + 7^3 + 1^3 = 27 + 343 + 1 = 371
  • 407:43+03+73=64+0+343=4074^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407

易错点

⚠️ 注意:

  1. 模拟题要仔细读题
  2. 注意边界条件
  3. 枚举要注意时间复杂度
  4. 使用合适的数据结构简化代码