1 条题解

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

    📝 题目大意

    给定一个长度为 NN 的正整数数列,相邻元素不相等。反复找到第一个相邻两项差的绝对值不为 11 的位置,在它们之间补全所有缺失的整数(递增或递减补全),直到所有相邻元素的差的绝对值都为 11。输出最终数列。

    💡 解题思路

    1. 题目分析N100N \le 100Ai100A_i \le 100,数据范围很小,直接模拟即可。表面上题目要求"每次找第一个差不为 1 的位置插入,然后重新扫描",但实际上可以一次遍历完成,因为处理完当前对后,结果序列的最后一个元素恰好就是 Ai+1A_{i+1},不会影响后续处理。

    2. 算法推导

      • 先将 A0A_0 放入结果数组 result
      • 遍历 i=0N2i = 0 \sim N-2,对于每一对 (Ai,Ai+1)(A_i, A_{i+1})
        • Ai<Ai+1A_i < A_{i+1}(上升):依次插入 Ai+1,Ai+2,,Ai+11A_i+1, A_i+2, \ldots, A_{i+1}-1
        • Ai>Ai+1A_i > A_{i+1}(下降):依次插入 Ai1,Ai2,,Ai+1+1A_i-1, A_i-2, \ldots, A_{i+1}+1
        • 最后插入 Ai+1A_{i+1} 本身。
      • 输出 result 数组。
    3. 边界与细节

      • 相邻两数差已经为 11 时,内层循环不执行,只插入 Ai+1A_{i+1} 本身,不会重复插入。
      • 插入的中间值不包含端点(x < A[i+1]x > A[i+1]),避免重复。
      • 题目保证 AiAi+1A_i \neq A_{i+1},所以无需考虑相等的情况。

    ⏱️ 复杂度分析

    • 时间复杂度O(NmaxAiAi+1)O(N \cdot \max|A_i - A_{i+1}|),最坏情况下 O(N×100)O(N \times 100),即 O(104)O(10^4),完全可行。
    • 空间复杂度O(NmaxAiAi+1)O(N \cdot \max|A_i - A_{i+1}|),用于存储结果序列。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    int main() {
        int N;
        cin >> N;
        vector<int> A(N);
        for (int i = 0; i < N; i++) {
            cin >> A[i];
        }
        vector<int> result;
        result.push_back(A[0]);                    // 先放入第一个元素
        for (int i = 0; i < N - 1; i++) {
            if (A[i] < A[i + 1]) {                 // 上升段:插入中间递增的数
                for (int x = A[i] + 1; x < A[i + 1]; x++) {
                    result.push_back(x);
                }
            } else {                               // 下降段:插入中间递减的数
                for (int x = A[i] - 1; x > A[i + 1]; x--) {
                    result.push_back(x);
                }
            }
            result.push_back(A[i + 1]);            // 插入当前对的右端点
        }
        for (size_t i = 0; i < result.size(); i++) {
            if (i > 0) cout << " ";               // 空格分隔输出
            cout << result[i];
        }
        cout << endl;
        return 0;
    }
    
    • 1

    信息

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