★实验任务
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;
★数据输出
输出找到的最长子段的长度即可。
输入示例 |
---|
6 7 2 3 1 5 6 |
输出示例 |
---|
5 |
#include<bits/stdc++.h>
using namespace std;
int found_length(int a[],int start,int end)
{
int count = 1;
for(int i = start;i<end;i++)
{
if(a[i]<a[i+1]) count++;
}
return count;
}//找出当前位置为起点往后的递增序列长度
int main(){
int now,cur,pre;
int n;
cin>>n;
int arr[n];
for(int i = 0;i<n;i++)
{
cin>>arr[i];
}
cur = found_length(arr,0,n);//当前位置递增序列的长度
now = cur;//目前已知最长的序列的长度
pre = cur;//上一个递增序列的长度
int index = 0;
while(index<n)
{
index+=pre;
if(index==n)
break;
cur = found_length(arr,index,n);
if(cur>=now)//大于等于时直接加一,因为可以修改一个数字
now = cur+1;
if(arr[index-1]>=arr[index]&&arr[index+1]>arr[index]+1)//特殊情况凹型判断是否进行拼接
{
//凹型
now = now<pre+cur?pre+cur:now;
}
pre = cur;
}
cout<<now;
}