题意:删除一个数字之后,剩下的数列是非递增或非递减。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+10;
int a[maxm];
int n;
int ok;
void judge1()
{
int num=0;
int k;
for(int i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
num++;
k=i;
}
}
if(num==0)
ok=1;
else if(num==1)
{
//这些情况的例子 3 1 1 2 3 /*******/ 1 2 4 3 4 /*********/ 1 1 2 1 1 4 /*****/ 1 2 3 4 3
if(k==1||k==n-1||a[k-1]<=a[k+1]||a[k-2]<=a[k])
{
ok=1;
}
}
}
void judge2()
{
int num=0;
int k;
for(int i=1;i<n;i++)
{
if(a[i]>a[i-1])
{
num++;
k=i;
}
}
if(num==0)
ok=1;
else if(num==1)
{
if(k==1||k==n-1||a[k-1]>=a[k+1]||a[k-2]>=a[k])
{
ok=1;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
ok=0;
judge1();
if(ok)
{
printf("YES\n");
continue;
}
judge2();
if(ok)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
//正着找一个最长不下降L1,反正找一个最长不下降(正着就是最长不递减)L2,如L1==N||L1==N-1||L2==N||L2==N-1的话,证明可以YES,不然NO
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+10;
int a[maxm];
int b[maxm];
int dp1[maxm];
int dp2[maxm];
int n;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i;
int temp1,temp2;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
b[n-i+1]=a[i];
}
dp1[1]=a[1];
dp2[1]=b[1];
int len1=1;
int len2=1;
for(i=2; i<=n; i++)
{
if(dp1[len1]<=a[i])//最长不下降
{
dp1[++len1]=a[i];
}
else
{
temp1=upper_bound(dp1+1,dp1+len1+1,a[i])-dp1;
dp1[temp1]=a[i];
}
}
for(i=2; i<=n; i++)
{
if(dp2[len2]<=b[i])//反找最长不下降
{
dp2[++len2]=b[i];
}
else
{
temp2=upper_bound(dp2+1,dp2+len2+1,b[i])-dp2;
dp2[temp2]=b[i];
}
}
if(len1==n-1||len2==n-1||len1==n||len2==n)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}