解题报告:输入一个数列,选取一个子数列,要求最多只能改动这个子数列中的一个数,使得这个子数列是严格的升序的(严格升序没有相等的)
我的做法是,第一步把这个 数列的每个升序的子数列都找出来,然后看这些子数列能不能和跟它相邻的升序的子数列连接起来。

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn = 100000+5; 8 typedef __int64 INT; 9 INT que[maxn]; 10 struct node 11 { 12 int f,r,l; 13 }da[maxn]; 14 15 int main() 16 { 17 int n; 18 while(scanf("%d",&n)!=EOF) 19 { 20 for(int i = 0;i < n;++i) 21 scanf("%I64d",&que[i]); 22 INT f = 0,temp = que[0],s = 0; 23 que[n] = -0x7ffffffff; 24 for(int i = 0;i < n;++i) 25 if(que[i] >= que[i + 1]) 26 { 27 da[f].f = s; 28 da[f].r = i; 29 da[f].l = da[f].r - da[f].f + 1; 30 s = i+1; 31 f++; 32 } 33 // for(int i = 0;i < f;++i) 34 // printf("%d %d %d ",da[i].f,da[i].r,da[i].l); 35 int ans = 0; 36 for(int i = 0;i < f - 1;++i) 37 { 38 ans = max(ans,da[i].l); 39 if(f > 1) 40 ans = max(ans,da[i].l + 1); 41 if(da[i].l > 1 && que[da[i].r - 1] < que[da[i+1].f] - 1) 42 ans = max(ans,da[i].l + da[i+1].l); 43 if(da[i+1].l > 1 && que[da[i].r] < que[da[i+1].f + 1] - 1) 44 ans = max(ans,da[i].l + da[i+1].l); 45 } 46 if(f == 1) 47 ans = da[0].l; 48 if(f > 1) 49 ans = max(ans,da[f-1].l+1); 50 printf("%d ",ans); 51 } 52 return 0; 53 }