#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int pre;
cin >> pre;
if (n == 1) {
cout << "sorted";
return 0;
}
// --- 处理第二个数(确定初始趋势)---
int num;
cin >> num;
bool greater = false, less = false, equal = false;
if (num > pre) greater = true;
else if (num < pre) less = true;
else equal = true;
pre = num;
// --- 处理第3个及以后的数 ---
for (int i = 2; i < n; i++) {
cin >> num;
if (greater) {
if (num < pre) {
cout << "unsorted";
return 0;
}
} else if (less) {
if (num > pre) {
cout << "unsorted";
return 0;
}
} else if (equal) {
if (num != pre) {
if (num > pre) greater = true;
else if (num < pre) less = true;
}
}
pre = num;
}
cout << "sorted";
return 0;
}
看到了这题就想到了可以用状态机的思想来解决。
本题共有三种状态:大于、小于、等于。
(注:为了不使用数组,笔者使用了pre变量来存储前一个数,所以下文确定状态等操作,是从第二个数开始的)
所以思路拆成如下:
第一步、确定状态
就是根据第二个数和第一个数的关系,判断后续应该是大于、小于、等于。
第二步、判断当前是否符合该状态,不符合则退出
⚠️特别注意:本题是不完全递增递减。所以先大于后等于也是可以的。如递增状态,1 2 2 也是可以的。小于同理。

京公网安备 11010502036488号