3 条题解

  • 1
    @ 2026-9-20 15:15:43
    非常简单
    找规律
    ---谨记 一定要动笔--
    举个例子
    以下中A表示先添加,A'表示翻转后的结果
    
    i = 1
    
    A = 1
    A' = 1
    
    
    i = 2
    A = 12
    A' = 21
    
    
    i = 3
    A = 213
    A' = 312
    
    
    i = 4
    A = 3124
    A' = 4213
    

    下面这张图片中 我用黄色标注了这个奇数次输入的数绿色表示偶数位的数字。不难发现,如果总反转次数位偶数的时候,那么奇数的数字就会被翻转到后面去而且是按照输入顺序排列的。

    者是为甚么呢

    考虑在第一次的时候翻转无效,但是第二次(即偶数次)插入的时候会把这个数字翻转到前面去

    发现,当奇数位读入之后被插入到最后的时候,最后的末尾数字应该是应该是上上次的数(即上一个奇数次插入的数)所以是顺序的

    同理

    那么对于在前面半个部分的数,因为翻转这个式子的时候末尾是顺序的,所以转过来的时候就是倒序的。(所以下一次转回去就是正序的)

    总节

    所以对于所有前面的部分应该都是倒序的,后面的部分都是正序的

    下一步

    接下来考虑应该是奇数在前面还是偶数在前面。

    我们发现,当奇数次读入的时候会把这个所有奇数次的数字反转到前面,所以当n是奇数的时候,奇数就应该在前半部分。

    结束了

    综上

    n为奇数的时候所有奇数次读入的数字应该都以倒序在前面,偶数次读入的数字都用正序的形式在后面

    同理反之

    
    ```cpp
    for (int i = 1; i <= n; i++) {
            if (i % 2 == 0) {
                cin >> a[++tota];
            }
            else {
                cin >> b[++totb];
            }
        }
        if (n % 2 == 0) {
            for (int i = tota; i >= 1; i--) {
                cout << a[i] << ' ';
            }
            for (int i = 1; i <= totb; i++) {
                cout << b[i] << ' ';
            }
        }
        else {
            for (int i = totb; i >= 1; i--) {
                cout << b[i] << ' ';
            }
            for (int i = 1; i <= tota; i++) {
                cout << a[i] << ' ';
            }
        }
    

    信息

    ID
    2745
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    (无)
    递交数
    33
    已通过
    18
    上传者