1 条题解

  • 1
    @ 2026-4-5 14:53:31

    小明看书(LRX1)题解

    这是一道入门级数组遍历题目,核心需求:找到数组中第一个最小值,输出它的位置(从1开始计数)和数值

    解题思路

    1. 输入处理:先读入书的数量n,再读入n本书的页数数组。
    2. 遍历找最小值
      • 初始化:把第一本书作为初始最小值,位置记为1。
      • 从第二本书开始遍历,如果遇到比当前最小值更小的数,更新最小值和对应位置。
      • 注意:如果数值相等,不更新(保留第一个出现的)。
    3. 输出结果:输出最小值的位置和数值。

    完整代码(C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        // 加速输入输出(应对n=1e5的大数据量)
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
    
        vector<long long> a(n);  // 用long long防止数值溢出
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
    
        // 初始化:第一个数为最小值,位置是1(题目从1开始计数)
        int min_pos = 1;
        long long min_val = a[0];
    
        // 遍历数组找第一个最小值
        for (int i = 1; i < n; ++i) {
            if (a[i] < min_val) {
                min_val = a[i];
                min_pos = i + 1;  // 数组下标从0开始,位置+1
            }
        }
    
        // 输出结果
        cout << min_pos << " " << min_val << endl;
    
        return 0;
    }
    

    代码解释

    1. 输入加速 ios::sync_with_stdio(false); cin.tie(nullptr);:针对n≤1e5的大数据量,加快输入输出速度,避免超时。

    2. 数据类型long long存储页数:题目中页数最大为1e9int也能存,但long long更安全,无溢出风险。

    3. 核心遍历逻辑

      • 数组下标从0开始,题目要求位置从1开始,所以最终位置要+1
      • 只有严格小于当前最小值时才更新,保证保留第一个出现的最小值

    样例演示

    输入:

    5
    2 4 12 3 18
    
    • 初始最小值:2,位置1
    • 遍历后续数字:4、12、3、18都比2大,不更新
    • 输出:1 2

    边界情况测试

    1. 只有1本书 输入:1 100 → 输出:1 100
    2. 最小值在最后 输入:3 5 3 2 → 输出:3 2
    3. 多个相同最小值 输入:4 2 1 1 3 → 输出:2 1(保留第一个)

    总结

    1. 核心:遍历数组找第一个最小值,位置从1开始计数。
    2. 关键:相等值不更新,保证输出第一个最小值。
    3. 优化:大数据量必须加输入加速,避免超时。
    • 1

    信息

    ID
    601
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    46
    已通过
    13
    上传者