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);
}

 

posted @ 2021-03-05 16:18  zlc0405  阅读(189)  评论(0编辑  收藏  举报