小学数奥分类讨论
根据题意,很自然的考虑相邻两个数的距离
而由于一大串连续的数的性质与一个数的性质相同,因此可以“见微知著”,通过三个数的可行度推断出一串数的可行度
下面我们将间隔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;
}