1 条题解

  • 1
    @ 2026-3-22 17:31:08

    问题分析

    这个问题的核心是逐关计算前缀平均值(向下取整),并判断当前关卡难度是否超过该平均值。关键要点:

    1. 第1个关卡前面无关卡,平均值视为0,必然符合条件;
    2. 从第2关开始,每一关需要计算前面所有关卡的总和、数量,再求平均值(向下取整);
    3. 遍历过程中累计符合条件的关卡数量即可。

    完整C++代码实现

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        int n;
        // 读取关卡数量
        cin >> n;
        
        vector<int> levels(n);
        // 读取每个关卡的难度值
        for (int i = 0; i < n; ++i) {
            cin >> levels[i];
        }
        
        int count = 0;    // 记录符合条件的关卡数
        int sum = 0;      // 前缀和(前面所有关卡的难度总和)
        
        // 遍历每个关卡
        for (int i = 0; i < n; ++i) {
            int current_level = levels[i];
            int avg;       // 前面所有关卡的平均难度(向下取整)
            
            if (i == 0) {
                // 第1个关卡,前面无关卡,平均值为0
                avg = 0;
            } else {
                // 计算前面i个关卡的平均值(向下取整,整数除法自动实现)
                avg = sum / i;
            }
            
            // 判断当前关卡难度是否超过平均值
            if (current_level > avg) {
                count++;
            }
            
            // 更新前缀和(将当前关卡加入,供下一关计算)
            sum += current_level;
        }
        
        // 输出结果
        cout << count << endl;
        
        return 0;
    }
    

    代码详细解释

    1. 输入处理

      • 读取关卡数量n,并用vector<int>存储每个关卡的难度值;
      • 选择vector是因为其易用性,也可以用普通数组(如int levels[1001])。
    2. 核心变量

      • count:统计符合条件的关卡数,初始为0;
      • sum:记录“前面所有关卡”的难度总和,初始为0(遍历中动态更新)。
    3. 遍历逻辑(逐关判断)

      • 第1关(i=0)
        • 前面无关卡,平均值avg设为0;
        • 由于关卡难度≥1,必然满足current_level > 0count加1;
        • 更新sum为当前关卡难度。
      • 后续关卡(i≥1)
        • 计算前面i个关卡的平均值:sum / i(C++中整数除法会自动向下取整,无需额外处理);
        • 若当前关卡难度>平均值,count加1;
        • 更新sum(加上当前关卡难度,供下一关计算)。
    4. 输出结果:遍历结束后,输出统计的count值。

    测试用例验证(样例1)

    输入:

    5
    3 1 4 2 5
    

    执行过程: | 关卡i | 当前难度 | 前面总和sum | 前面数量 | 平均值avg | 是否>avg | count | sum更新后 | |-------|----------|-------------|----------|-----------|----------|-------|-----------| | 0 | 3 | 0 | 0 | 0 | 是 | 1 | 3 | | 1 | 1 | 3 | 1 | 3 | 否 | 1 | 4 | | 2 | 4 | 4 | 2 | 2 | 是 | 2 | 8 | | 3 | 2 | 8 | 3 | 2 | 否 | 2 | 10 | | 4 | 5 | 10 | 4 | 2 | 是 | 3 | 15 |

    最终输出3,与样例一致。

    边界情况测试

    • n=1:输入1 5 → 输出1(唯一关卡符合条件);
    • 所有关卡难度相同:输入3 2 2 2 → 第1关符合(2>0),第2关(2>2?否),第3关(2>2?否)→ 输出1
    • 严格递增序列:输入4 1 2 3 4 → 第1关(1>0)、第2关(2>1)、第3关(3>1)、第4关(4>2)→ 输出4

    总结

    1. 核心逻辑:通过前缀和动态计算前面所有关卡的平均值,逐关判断是否满足条件;
    2. 关键细节:第1关平均值为0,整数除法自动实现“向下取整”;
    3. 时间复杂度:O(n)(仅一次遍历),空间复杂度O(n)(存储关卡难度),完全满足n≤1000的限制。
    • 1

    信息

    ID
    613
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    62
    已通过
    9
    上传者