1 条题解

  • 0
    @ 2025-8-11 10:40:24
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() {
        // 读取总人数
        int n;
        cin >> n;
        
        // 读取所有同学的积分值
        vector<int> scores(n);
        for (int i = 0; i < n; i++) {
            cin >> scores[i];
        }
        
        // 创建一个动态数组,用于按顺序存储已进入教室的同学积分(从小到大排序)
        vector<int> classroom;
        // 记录开心同学的数量
        int happyCount = 0;
        
        // 遍历每位同学
        for (int i = 0; i < n; i++) {
            int currentScore = scores[i]; // 当前同学的积分
            
            // 在已排序的教室数组中查找:
            // 1. 查找第一个大于或等于当前积分的位置
            auto lowPos = lower_bound(classroom.begin(), classroom.end(), currentScore);
            // 计算积分比当前同学低的人数(在lowPos之前的所有人)
            int lowerCount = lowPos - classroom.begin();
            
            // 2. 查找第一个大于当前积分的位置
            auto highPos = upper_bound(classroom.begin(), classroom.end(), currentScore);
            // 计算积分比当前同学高的人数(在highPos之后的所有人)
            int higherCount = classroom.end() - highPos;
            
            // 判断是否开心:高积分人数不超过低积分人数
            if (higherCount <= lowerCount) {
                happyCount++; // 开心人数加1
            }
            
            // 将当前同学插入教室数组的合适位置,保持数组有序
            classroom.insert(lowPos, currentScore);
        }
        
        // 输出开心同学的总人数
        cout << happyCount << endl;
        
        return 0;
    }
    

    代码解释: 输入部分:

    cin >> n; 读取同学总人数

    for循环读取每个同学的积分值

    核心变量:

    classroom:动态数组,存储已进入教室的同学积分(始终保持从小到大排序)

    happyCount:记录开心同学的数量

    处理每位同学:

    currentScore:当前进入教室同学的积分

    查找位置:

    lower_bound():找到第一个大于或等于当前积分的位置

    upper_bound():找到第一个大于当前积分的位置

    计算人数:

    lowerCount:积分比当前同学低的人数(在lowPos之前的所有人)

    higherCount:积分比当前同学高的人数(在highPos之后的所有人)

    判断开心条件:if (higherCount <= lowerCount) 如果高积分人数不超过低积分人数,则开心

    更新教室:

    classroom.insert(lowPos, currentScore); 将当前同学插入到有序数组的正确位置

    输出结果:

    cout << happyCount; 输出开心同学的总人数

    简单说明: 想象同学们一个一个进入教室,每个同学进来时:

    先数一数教室里已经有多少人积分比他低(lowerCount)

    再数一数有多少人积分比他高(higherCount)

    如果高积分人数不超过低积分人数,他就会开心😊

    然后这位同学就加入教室,下一个同学继续这个过程

    这样一步一步计算,最后就能知道总共有多少同学开心啦!

    信息

    ID
    486
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    7
    已通过
    1
    上传者