1 条题解

  • 0
    @ 2026-5-19 23:29:42

    问题理解

    我们需要构造一个长度为 nn 的排列,使得可以执行尽可能多的“缩操作”。

    缩操作的定义

    • 选择一个下标 ii2im12 \le i \le m-1),满足 ai>ai1a_i > a_{i-1}ai>ai+1a_i > a_{i+1}(即 aia_i 是严格局部最大值)
    • 移除 aia_i

    目标:最大化可以执行的操作次数。


    关键观察

    1. 最大元素的位置
      在整个排列中,最大值 nn 只能出现一次。只要最大值 nn 不在两端(即不在第一个或最后一个位置),它就一定是局部最大值(因为所有其他元素都比它小)。因此,只要 nn 不在两端,它就可以被移除。

    2. 移除后的变化
      当我们移除 nn 后,剩下的排列中会出现新的最大值(即 n1n-1)。同样地,只要 n1n-1 不在当前数组的两端,它就可以被移除。

    3. 过程持续
      这个过程可以一直持续,直到数组中只剩下两个元素。因为:

      • 当数组长度为 22 时,没有下标 ii 满足 2im12 \le i \le m-1(因为 m1=1m-1 = 1
      • 所以无法再执行任何操作
    4. 最大操作次数
      初始数组长度为 nn,最终数组长度为 22,每执行一次操作数组长度减少 11,因此最多可以执行:

      n2n - 2

      次操作。


    如何达到最大操作次数?

    我们需要让每次移除的都是当前的最大值。也就是说:

    • 首先移除 nn
    • 然后移除 n1n-1
    • 然后移除 n2n-2
    • ...
    • 最后移除 33

    剩下的两个元素是 1122

    关键条件:每次要移除的最大值必须不在两端


    构造方法

    一种简单的构造是:

    • 11 放在最后
    • 22 放在最前
    • 其余数字 3,4,,n3, 4, \dots, n 按顺序放在中间

    即:

    [2,3,4,,n,1][2, 3, 4, \dots, n, 1]

    验证:

    • nn 在位置 n1n-1(从 11 开始计数),左右都有元素 → 可以移除
    • 移除 nn 后,n1n-1 成为新的最大值,仍然在中间 → 可以移除
    • 依此类推,直到剩下 [2,1][2, 1]

    为什么这样可行?

    在排列 [2,3,4,,n,1][2, 3, 4, \dots, n, 1] 中:

    • 对于任意 kk3kn3 \le k \le n),kk 的左边是 k1k-1,右边是 k+1k+1(或当 k=nk=n 时右边是 11
    • 由于所有数字都不同,且 kk 是当前剩余元素中的最大值时,它一定大于左右邻居
    • 因此 kk 满足局部最大值的条件,可以被移除

    算法步骤

    对于每个测试用例:

    1. 输出 2,3,4,,n2, 3, 4, \dots, n
    2. 最后输出 11

    复杂度

    • 时间复杂度:O(n)O(n) 每个测试用例
    • 空间复杂度:O(1)O(1)(不考虑输出)

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n;
        cin >> n;
        
        for (int i = 2; i <= n; i++) {
            cout << i << ' ';
        }
        cout << 1 << endl;
    }
    
    int main() {
        int t;
        cin >> t;
        while (t--) solve();
        return 0;
    }
    

    示例验证

    示例 1:n=3n = 3

    • 输出:2 3 12\ 3\ 1
    • 操作过程:
      • 移除 33(位置 22):[2,1][2, 1]
      • 无法继续
      • 操作次数 = 1=n21 = n - 2

    示例 2:n=6n = 6

    • 输出:2 3 4 5 6 12\ 3\ 4\ 5\ 6\ 1
    • 可以执行 44 次操作,达到最大值 n2=4n - 2 = 4

    结论

    任何满足 1122 在两端的排列都能达到最大操作次数 n2n-2。最简单的构造是:

    [2,3,4,,n,1][2, 3, 4, \dots, n, 1]
    • 1

    信息

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