NC13134 牛牛的数列(分类讨论)
链接:https://ac.nowcoder.com/acm/problem/13134
来源:牛客网
牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
// Problem: 牛牛的数列 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/problem/13134 // Memory Limit: 65536 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; int n,a[maxn]; vector<pair<int,int> > p; int main () { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",a+i); for (int i=1;i<=n;i++) { int j; for (j=i+1;j<=n;j++) if (a[j]<=a[j-1]) break; p.push_back(make_pair(i,j-1)); i=j-1; } int ans=0; //for (int i=0;i<p.size();i++) printf("%d %d\n",p[i].first,p[i].second); for (int i=1;i<p.size();i++) { if (p[i-1].second+1==p[i].first) { if (p[i-1].second==p[i-1].first||a[p[i].first]>a[p[i-1].second-1]+1) { ans=max(ans,p[i].second-p[i].first+1+p[i-1].second-p[i-1].first+1); } if (p[i].second==p[i].first||a[p[i].first+1]>a[p[i-1].second]+1) { ans=max(ans,p[i].second-p[i].first+1+p[i-1].second-p[i-1].first+1); } } else if (p[i-1].second+2==p[i].first) { if (a[p[i].first]>a[p[i-1].second]+1) { ans=max(ans,p[i].second-p[i].first+1+p[i-1].second-p[i-1].first+1+1); } } } printf("%d\n",ans); }