【问题描述】
对于一个具有 n 个元素的数组,如果可以将其分为两个部分,它的各个部分都是一个非严格有序数组,则我们称这样的数组为近序数组,例如
数组 1、2、3、4、4、3、2、1是近序数组,数组 4、2、1、2、3、4也是近序数组,而1、5、7、3、9、3就不是近序数组,数组1、3、3、4是有序数组,是近序数组的特例。
【输入形式】
输入的第一行为一个整数n,表示数组的元素个数。
接下来的一行,表示数组的元素。
【输出形式】
如果给定的数组是近序数组输出Yes,否则输出No。
【样例输入1】
8
1 2 3 4 4 3 2 1
【样例输出1】
Yes
【样例输入2】
3 4 3 4
【样例输出2】
Yes
【样例输入3】
3 4 3 4 3
【样例输出3】
No
【样例说明】
【评分标准】
//给大家解读一下
上网也没找到近序数组的定义
个人认为近序数组就是由两个不一定相同单调性的区间构成的数组
记增区间为↑,减区间为↓,不增不减区间为=,若中间有两数相同为==
则近序数组可以为:
1.↑、↓、=(单纯一直增加,减小和不变的)
2.↑↓、↑=、↑==↓、↓↑、↓=、↓==↑、=↑、=↓(说明来于CSDN博主「一二爱上蜜桃猫」
代码如下;
#include <iostream>
using namespace std;//此题可以根据单调性逆转次数做解,
//超过两次即不可分为两个非严格有序数组
int main()
{
int T=0,n,i;
cin>>n;
int*a=new int[n];
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<(n-2);i++)
{
if((a[i]-a[i+1])*(a[i+1]-a[i+2])<0)//判断单调性逆转次数
{
T+=1;
i+=1;//每次逆转后多往后推一位避免重复检测
}
else
{
T=T;
}
}
if(T>1)//逆转两次以上即不可分为两个非严格有序数组
cout<<"No";
else
cout<<"Yes";
return 0;
}