CF652B z-sort 题解

Content

定义一个数组是 \(\text{Z}\) 排序过的,当且仅当:

  • 对于所有的 \(i=2k+1(k\in\mathbb Z)\)\(a_i\leqslant a_{i-1}\)
  • 对于所有的 \(i=2k(k\in\mathbb Z)\)\(a_i\geqslant a_{i-1}\)

现在给出一个长度为 \(n\) 的数组 \(A\),请你对它进行 \(\text{Z}\) 排序。

数据范围:\(1\leqslant n\leqslant 10^3\)\(1\leqslant A_i\leqslant 10^9\)

Solution

很容易的一道题目,不知道为什么,感觉题解里面都想复杂了,于是我来给一个比较简单易懂的题解吧。qwq

我们先找所有为奇数的 \(i\),看看是否有 \(a_i>a_{i-1}\),如果是的话将它们两个交换,否则不变,使得 \(a_i\leqslant a_{i-1}\)。再找所有为偶数的 \(i\),看看是否有 \(a_i<a_{i-1}\),如果是的话将它们两个交换,否则不变,使得 \(a_i\geqslant a_{i-1}\)。最终得到的数组就是 \(\text Z\) 排序过的了。

Code

const int N = 1e3 + 7;
int n, a[N];

int main() {
    n = Rint;
    F(i, 1, n) a[i] = Rint;
    for(int i = 3; i <= n; i += 2) if(a[i] > a[i - 1]) swap(a[i], a[i - 1]);
    for(int i = 2; i <= n; i += 2) if(a[i] < a[i - 1]) swap(a[i], a[i - 1]);
    F(i, 1, n) write(a[i]), putchar(' ');
	return 0;
}
posted @ 2021-12-16 11:33  Eason_AC  阅读(32)  评论(0)    收藏  举报