【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"));
}
}