1 条题解

  • 0
    @ 2026-6-19 10:30:52

    📝 题目大意

    NN 座大楼横向排列,第 ii 座大楼高度为 HiH_i。判断是否存在比第 11 座大楼更高的大楼,若存在则输出其中最靠左的大楼编号(从 11 开始计数),否则输出 1-1

    💡 解题思路

    1. 题目分析N100N \leq 100Hi100H_i \leq 100,数据范围极小,直接暴力扫描即可。关键在于理解"最靠左"意味着从左到右遍历,遇到第一个满足条件的就停止。

    2. 算法推导

      • H1H_1 为基准高度 first
      • 初始化答案 ans = -1(表示未找到)。
      • i=2i = 2NN(对应代码中 i = 1N-1,下标从 00 开始)依次检查:
        • Hi>H1H_i > H_1,则 ans = i + 1(转为 11 基编号),并立即 break 退出循环,保证得到的是最靠左的答案。
      • 输出 ans
    3. 边界与细节

      • 所有大楼高度均不大于第 11 座时,ans 保持为 1-1,直接输出即可。
      • 注意输出的是 11 基编号,而代码中数组下标从 00 开始,因此需要用 i + 1 转换。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),最坏情况下扫描完整个数组。
    • 空间复杂度O(N)O(N),存储高度的数组(也可优化为 O(1)O(1),但 N100N \leq 100 无必要)。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int N;
        cin >> N;
        vector<int> H(N);
        for (int i = 0; i < N; i++) {
            cin >> H[i];               // 读入所有大楼高度
        }
        int first = H[0];              // 基准高度:第 1 座大楼的高度
        int ans = -1;                  // 默认答案 -1,表示未找到
        for (int i = 1; i < N; i++) {  // 从第 2 座大楼开始向右扫描
            if (H[i] > first) {        // 找到第一个比 H1 高的
                ans = i + 1;           // 转为 1 基编号
                break;                 // 立即退出,保证是最靠左的
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    794
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者