★实验任务
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 <cstring>
using namespace std;
int main()
{
int a[100087];
int sum=1,n,s1,t,i,p,q=0,m;
cin >> n; //输入子段长度
for(i=1;i<=n;i++)
cin >> a[i]; //输入整个子段
int L=1;
for(L=1;L<n;L++)
{
i=L;
s1=1;//s1为子段长度
t=0;//t相当起一个作用,当t++表示改变一个数使子段继续递增
if(q==-1 || q==1)
a[p]=m;//还原子段的值
q=0;//q用于标记数组是否变更
p=0;//p用于记录变更的数组的值的下标
m=0;//m用于记录变更前的数组的值
if( a[L]>=a[L+1] )//判断前两个是否递增
{
s1++;
t++;
i++;
}
for(;i<n && t!=2;i++)
{
if( a[i]<a[i+1] )
s1++;
else
{
t++;
if(t==2)
break;
else//有两种不同的变更方法,视情况而定,不可统一
{
if( (a[i+1]-a[i-1])<2 )//例如 1 2 7 3 4
{
m=a[i+1];
a[i+1]=a[i]+1;
p=i+1;
q=-1;
}
else//例如 1 2 7 6 7
{
m=a[i];
a[i]=a[i-1]+1;
p=i;
q=1;
}
s1++;
}
}
}
if(sum<s1)
sum=s1;
}
cout << sum;
return 0;
}