一.题目
二.思路
所谓锯齿数组,是由一个个锯齿组成的,一般情况下,一个锯齿与相邻的三个点有关。
本题要求剔除非锯齿的数据,采用一遍循环数组的方法,剔除数据时可以分为三种情况来考虑:数组开头、数组中间和数组结尾。但数组开头和数组结尾的情况可以等同,于是这里只用分前两种情况。
数组开头,剔除具有连续趋势的点,删除下图中的B、C两点(也可以是AB两点或AC两点)。
数组中间,剔除具有连续趋势的点,但保留两端的端点,删除下图中的G、H点。
三.代码
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
int num[N];
for(int i=0;i<N;i++)
{
scanf("%d",&num[i]);
}
int lenth=0,cross=1,began=1;
for(int i=1;i<N-1;i++)
{
if(began==1) //确定锯齿数组的开头
if((num[i]>num[i-cross]&&num[i]>num[i+1])||(num[i]<num[i-cross]&&num[i]<num[i+1]))
{
lenth = 3;//一个数组如果存在锯齿数组,一般就至少存在三个数
cross = 1;//偏移初始化
began=0;//控制开头
}
else cross++;//偏移
else //锯齿数组的中间
if((num[i]>num[i-cross]&&num[i]>num[i+1])||(num[i]<num[i-cross]&&num[i]<num[i+1]))
{
lenth++;
cross = 1;
}
else cross++;
}
if(lenth==0)//判断该数组是否为只有两个不同数的数组,只有两个不同数的数组是个数为2的锯齿数组
for(int i=0;i<N-1;i++)
if(num[i]!=num[i+1]) lenth = 2;
int count=0;
if(N>0&&lenth==0)//判断该数组是否为全等的数组,全等的数组是个数为1的锯齿数组
{
for(int i=0;i<N;i++)
if(num[i]==num[0]) count++;
if(count==N) lenth = 1;
}
printf("%d",lenth);
}