cf div2 B 1671BConsecutive Points Segment

小学数奥分类讨论

根据题意,很自然的考虑相邻两个数的距离

而由于一大串连续的数的性质与一个数的性质相同,因此可以“见微知著”,通过三个数的可行度推断出一串数的可行度

下面我们将间隔1的相邻的数的组数称为cnt1,2的称为cnt2

cnt1==1: 例如124,245,显然可以

cnt1==2:例如246,我们可以246->346->345,同理其他也可(注意最后因为3无法移动,故移动6)

cnt1==3:例如2468,2468->3468读者可自行推断,并不合法

cnt2==1:显然合法125->235->234

cnt2==2:147->236所有数字已移动不合法

推断出cnt1<=2,cnt2<=1,

当cnt1==1&&cnt2==1时:136->245不合法

故可用cnt统一cnt1,cnt2,具体优化见代码

ac

#include<iostream>
using namespace std;

const int N = 200005;
int t, n;
int a[N];

int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		for (int i = 0; i < n; i++)scanf("%d",&a[i]);
		bool is = true;
		int cnt = 0;
		for (int i = 0; i < n; i++)
		{
			if (i && a[i] - a[i - 1] == 2)cnt++;
			if (i && a[i] - a[i - 1] == 3)cnt += 2;
			if (cnt>2||(i&&a[i]-a[i-1]>3))
			{
				is = false;
				break;
			}
		}
		if (is)puts("YES");
		else puts("NO");
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值