最长递增子段

★实验任务

YZF 有一个序列 A,由 n 个整数组成。

我们将子段 A 称为 Ai、Ai +1、Ai+ 2、…Aj(1<=i<=j=n)表示 A 的子段。

你的任务是找到 A 的最长的子段,这样就可以从子段最多改变一个数(可改变为任一个整数),使子段严格地增加。

输出找到的最长子段的长度即可。

★数据输入

输入第一行为一个正整数 n

第二行为 n 个数,第 i 个代表 ai。,0<=ai<=1000000000

对于 30%的数据,1<=n<=666;

对于 100%的数据,1<=n<=100086;

★数据输出

输出找到的最长子段的长度即可

 

#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int i;
	int a[100086];
	int l[10086]={0};
	int num=0;
	cin>>a[1];l[num]++;
	for(i=2;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]<=a[i-1])
		{
			num++;
		}
		l[num]++;//求每段字段长度
	}
	int sign=0;
	int max=0;
	for(i=0;i<=num;i++)
	{
		sign+=l[i];//在数组的位置
		if(a[sign+1]-a[sign-1]>=2)// 1 2 7 3 4
		{
			if(max<l[i]+l[i+1])
			{
				max=l[i]+l[i+1];
			}
		}
		
		else if(a[sign+2]-a[sign]>=2)// 1 2 7 6 7
		{
			if(max<l[i]+l[i+1])
			{
				max=l[i]+l[i+1];
			}
		}
		else
		{
			if(max<l[i]+1)
			{
				max=l[i]+1;//均长
			}
		}
	}
	cout<<max;
	return 0;
	
}

 

posted @ 2022-09-26 20:31  墨燃云  阅读(21)  评论(0编辑  收藏  举报