分析:因为序列是不严格单调的,所以挪动一个数其实就相当于把这个数给删了.如果a[i] < a[i-1],那么可以删掉a[i],也可以删掉a[i-1](!如果没考虑到这一点就只有90分),删后判断一下序列是否单调,删的次数是否≤1即可.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, a[1000010], cnt; bool flag = false; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 2; i <= n; i++) if (a[i] < a[i - 1]) { if (cnt == 1) { flag = 1; break; } if (i != n && a[i + 1] < a[i - 1] && a[i] < a[i - 2]) { flag = 1; break; } cnt++; } if (flag) puts("NO"); else puts("YES"); return 0; }