CF952C Ravioli Sort
题目描述
众所周知,有一种叫做[意大利面排序](https://en.wikipedia.org/wiki/Spaghetti_sort)的算法。你决定自己实现一个类似的排序算法,但是当你检查你的储藏室时,你意识到你没有意大利面了!你唯一有的是意大利饺子,但你不会因此而放弃…
你构思了以下算法。对于数组中的每个数字 $a_i$,构建一个由 $a_i$ 个意大利饺子组成的堆栈。下面的图片展示了当 $ai = 4$ 时的堆栈。
[](https://espresso.codeforces.com/04041f95b0a3e1dee7d8b24fa163e68861737411.png)
将这些堆栈按照输入数组中对应数字的顺序排列在一行中。找到最高的堆栈(如果有多个最高的堆栈,选择最左边的一个)。移除这个堆栈,并将其高度添加到输出数组的末尾。将行中的堆栈向左移动,使它们之间没有间隙。重复这个过程,直到所有的堆栈都被移除。
起初,你对自己的算法感到非常满意,但是当你尝试对更多的输入进行排序时,你意识到它并不总是能产生正确的排序数组。事实证明,当两个相邻的意大利饺子堆栈(在过程的任何步骤中)在高度上相差两个或更多时,较高堆栈的顶部意大利饺子会滑落到较低的堆栈上面。
给定一个输入数组,判断描述的算法是否能正确排序它。
输入格式
输入的第一行包含一个数字 $n\ (1 \le n \le 10)$——数组的大小。
输入的第二行包含 $n$ 个以空格分隔的整数 $a_i\ (1 \le a_i \le 100)$——数组中的元素。
输出格式
如果可以使用所描述的过程对数组进行排序,则输出“$\text{YES}$”;如果无法排序,则输出“$\text{NO}$”。
Translated by: **[zhangmoqing](https://www.luogu.com.cn/user/1125291)**
说明/提示
In the second example the array will change even before the tallest stack is chosen for the first time: ravioli from stack of height 3 will slide on the stack of height 1, and the algorithm will output an array $ {2,2,2} $ .