Almost Sorted Array HDU - 5532 长春站

传送门

题目大意:给一个数列,  如果这个数列删除最多一个元素, 可以是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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值