0
点赞
收藏
分享

微信扫一扫

【Codeforces Round #786 (Div. 3)】 1674D. A-B-C Sort 题解

爱我中华8898 2022-05-03 阅读 83

【Codeforces Round #786 (Div. 3)】 1674D. A-B-C Sort 题解

1674D. A-B-C Sort 题解

一、题目描述

(一)、原题链接

原题链接:https://codeforces.com/contest/1674/problem/D

在这里插入图片描述

(二)、题目大意

有多组测试数据,每组测试数据为长度为n的数组,记数组A。此外,另有大小为n的空数组数组B数组C

有如下步骤:

  • 数组A的末尾取数,然后放到数组B中数据的中间。(若数组B中元素为奇数个,可以放在中间元素的左边或者右边)
  • 数组B的中间取数(若数组B中元素为偶数个,可以取中间左边的元素或者右边的元素),然后放到数组C中数据的末尾。

问:能否在以上两种步骤执行结束使得数组C为升序数组?

二、解题思路

直接去看给出的样例难以看出端倪。所以试着手动模拟一下具体的移动情况。

(一)、假设为元素个数为偶数时的情况

第一部分操作:
在这里插入图片描述
分析一下:在经过第一部分的操作后数组从内向外,左右扩展分别是原数组的第1、2; 3、4;…

那么在执行第二部分操作时,无论是哪种情况,都可以很容易的将导出数组为【1,2,3,4,5,6】。

那么整个操作中可以操作的顺序就是1、2; 3、4; …的顺序。所以,分别将数组中第1,2位;第3,4位; …按顺序排列后,如果 整个数组 有序,那么就可行,输出“YES”,否则输出“NO”

(二)、假设为元素个数为奇数时的情况

奇数的情况与偶数类似,不同的是,第1位不参与顺序的排列。即:

整个操作中可以操作的顺序就是2、3; 4、5; …的顺序。所以,分别将数组中第2,3位;第4,5位; …按顺序排列后,如果 整个数组 有序,那么就可行,输出“YES”,否则输出“NO”

三、注意事项

注意元素个数奇数和偶数的区别!

四、代码全览

下面是AC代码。

// A-B-C Sort
#include <iostream>
#include <cstdio>
#define DEBUG
using namespace std;
#define N 200020
void solve(void);

int a[N], n;

int main(void)
{
    int test;
    scanf("%d", &test);
    while (test--)
        solve();
    return 0;
}

void solve(void)
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    if (n == 1)
        printf("YES\n");
    else
    {
        bool flag = true;
        if (n % 2 == 0)
        {
            for (int i = 0; i < n; i += 2)
                if (a[i] > a[i + 1])
                    swap(a[i], a[i + 1]);
        }
        else
        {
            for (int i = 1; i < n; i += 2)
                if (a[i] > a[i + 1])
                    swap(a[i], a[i + 1]);
        }

        // 是否按升序排列
        for (int i = 1; i < n; i++)
            if (a[i] < a[i - 1])
            {
                flag = false;
                break;
            }
        printf("%s\n", (flag ? "YES" : "NO"));
    }
}
举报

相关推荐

0 条评论