题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5532
题目翻译:给出一个N个数的序列,然后看删除一个序列中的一个数后,序列是否可以变成非递增或非
递减序列,也就是可以是相等的。
解题思路:如果原序列非递增非递减序列的长度大于等于N-1时,就是,原来时模拟的,可是模拟的时候
发现有点问题,然后用LIS写,但是由于它是不严格递增的,有相等的情况,自己的写的二分查找一直写
不对,最后真的放弃二分加LIS了,还是回到原来的模拟方法。参考了别人的方法,发现和自己原来写的
差不多,不过忘考虑了一种情况。
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6;
int num[maxn];
int main() {
int T,N;
scanf("%d",&T);
while(T--) {
scanf("%d",&N);
for(int i = 1; i <= N; i++) {
scanf("%d",&num[i]);
}
int num1,num2;
num1 = 0;
num2 = 0;
///按从小到大走
num[0] = -inf;
num[N+1] = inf;
bool flag1 = true;
bool flag2 = true;
for(int i = 1; i <= N; i++) {
///这种情况只能出现一个
if(num[i]<num[i-1]) {
if(num1 == 1) {
flag1 = false;
break;
}
num1++;
if(num[i+1]>=num[i-1] || num[i]>=num[i-2])
continue;
else {
flag1 = false;
break;
}
}
}
//从大到小
num[0] = inf;
num[N+1] = -inf;
for(int i = 1; i <= N; i++) {
if(num[i] > num[i-1]) {
if(num2 == 1) {
flag2 = false;
break;
}
num2++;
if(num[i+1]<=num[i-1] || num[i]<=num[i-2]) {
continue;
} else {
flag2 = false;
break;
}
}
}
if(flag1 || flag2) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}