1 条题解

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

    📝 题目大意

    给定 N,L,RN, L, R,将初始数列 (1,2,,N)(1, 2, \dots, N) 的第 LL 项到第 RR 项进行逆序排列,输出操作后的数列。

    💡 解题思路

    1. 题目分析N100N \leq 100,数据范围极小,直接模拟即可。核心是将区间 [L,R][L, R] 反转,其余部分保持不变。
    2. 算法推导:将数列分为三段:
      • 前缀 [1,L1][1, L-1]:原样输出 1,2,,L11, 2, \dots, L-1
      • 反转区间 [L,R][L, R]:从 RRLL 降序输出,即 R,R1,,LR, R-1, \dots, L
      • 后缀 [R+1,N][R+1, N]:原样输出 R+1,R+2,,NR+1, R+2, \dots, N
    3. 边界与细节
      • L=RL=R 时,反转区间长度为 11,降序输出与原序一致,无需特判。
      • L=1L=1 时,前缀为空,直接从反转区间开始输出。
      • R=NR=N 时,后缀为空,输出完反转区间即结束。
      • 注意末尾不要有多余空格,标准代码中后缀的输出做了特殊处理。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),遍历每个位置恰好一次。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    using namespace std;
    int main() {
        int N, L, R;
        cin >> N >> L >> R;
        // 1. 输出前缀:1 到 L-1
        for (int i = 1; i < L; i++) {
            cout << i << " ";
        }
        // 2. 输出反转区间:从 R 降序到 L
        for (int i = R; i >= L; i--) {
            cout << i << " ";
        }
        // 3. 输出后缀:R+1 到 N(注意控制末尾空格)
        for (int i = R + 1; i <= N; i++) {
            if (i > R + 1) cout << " ";
            cout << i;
        }
        cout << endl;
        return 0;
    }
    
    • 1

    信息

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