题目大意:给一个数列, 如果这个数列删除最多一个元素, 可以是0个, 就是有序的(不下降或者不上升都可以), 那么就认为这个基本有序。
思路:一看非常简单, 但是一想又很麻烦, 因为摘一个好说, 但是这个可能是开头, 可能是结尾, 这两个可能摘掉前一个, 可能摘掉当前这个。还得看上升还是下降。很容易让人心烦,(唉~比赛还打心理战, 毕竟是上来的水题啊, 多影响心情)
其实这些问题可以逐步解决, 开头和结尾我们可以多加一个一定符合要求的数, 这样就避免了搜开头和结尾, 两个摘掉哪一个的问题, 我们只需要考虑哪一个符合条件就行, 比如这两个我们取一个, 看看是否符合条件, 如果不符合那就NO了, 符合那么计数即可, 只修改一次。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int INF = 100000000;
int A[100050];
int n;
bool cheek(int t)
{
A[0] = -INF*t;
A[n+1] = INF*t;
int cnt = 0;
for(int i=1; i<=n; i++)
if(A[i]*t < A[i-1]*t)
{
if(cnt) return false;
if(A[i]*t <= A[i+1]*t && A[i]*t >= A[i-2]*t)
{
cnt++;
}
else if(A[i-1]*t >= A[i-2]*t && A[i-1]*t <= A[i+1]*t)
{
cnt++;
}
else return false;
if(cnt > 1) return false;
}
return true;
}
int main()
{
int T;
cin >>T;
while(T--)
{
scanf("%d", &n);
int a =0, b = 0;
for(int i=1; i<=n; i++)
scanf("%d", &A[i]);
if(cheek(1) || cheek(-1)) printf("YES\n");
else printf("NO\n");
}
return 0;
}