WXYZ与绿豆饼

来源:互联网 发布:数据库概念模型图事例 编辑:程序博客网 时间:2024/04/20 08:00

Problem Description

WXYZ很喜欢吃绿豆饼,而且每次都能吃很多。但是担心WXYZ长的太胖,妈妈把买回来的一卷卷的绿豆饼排成一列(每卷绿豆饼的高度可能是不一样的),规定WXYZ只能取其中一段连续的并且高度严格上升的绿豆饼来吃。
可怜的WXYZ发现,根据这个规则,每次他只能拿到很少的绿豆饼,于是他想到了一个办法:趁妈妈不注意的时候改变某一卷绿豆饼的高度(压扁或拉长它)。WXYZ知道,这样就可以拿到一段长得多的连续的而且高度严格上升的绿豆饼了。
真是太聪明了!不过应该改变哪一卷绿豆饼的高度才能使得可以拿走的连续的一段高度严格上升的绿豆饼最多呢?嗯,这个问题就交给你了,如果你能成功解答说不定WXYZ会分给你一些绿豆饼呢。
注意:修改之后绿豆饼的高度最小为1,最大为10000,并且高度只能是整数。

Input

输入有多组测试数据,每组测试数据的第1行为一个正整数N(<=10000),表示有绿豆饼的卷数。
输入的第2行为N个正整数,表示这N卷绿豆饼的高度,两个正整数之间会有一个空格,高度值不会大于10000

Output

对于每组测试数据输出一行,包括一个整数,表示修改之后最长的一段连续且高度严格上升的绿豆饼的长度。

Sample Input

66 1 2 2 4 44

Sample Output

4
#include<stdio.h>#define maxn 10001//a[i]表示第i卷的高度,b[]表示向前延伸的最远距离,c[]表示向后延伸的最远距离int n,a[maxn],b[maxn],c[maxn];int main(){    //mx用于存储最终答案,i和tmp为临时变量    int i,mx,tmp;    while(~scanf("%d",&n))    {        for(i=0;i<n;i++)    scanf("%d",&a[i]);        b[0]=c[n-1]=1;        //依递推式计算b[]        for(i=1;i<n;i++)    if(a[i-1]<a[i]) b[i]=b[i-1]+1; else b[i]=1;        //依递推式计算c[]        for(i=n-2;i>=0;i--)    if(a[i]<a[i+1]) c[i]=c[i+1]+1; else c[i]=1;        //mx存储当前最优答案,初始化为1        mx=1;        if(n>1&&a[1]>1)    mx=c[1]+1;        //绿豆饼的个数大于一,长度也大于一;        if(n>1&&a[n-2]<10000&&b[n-2]+1>mx)    mx=b[n-2]+1;        //绿豆饼的个数大于一,且倒数第二个长度小于10000;        //枚举改变的绿豆饼卷        for(i=1;i<n-1;i++)        //去掉第一个和最后一个长度;        {            if(a[i-1]<10000)  //如果第i个卷可以比之前的更长(没有达到最长);            {                tmp=b[i-1]+1;     //通过增长i号卷可以使i之前的递增序列+1                if(a[i-1]+1<a[i+1])    tmp+=c[i+1];  //判断是否可以和以后的卷连在一起                if(tmp>mx)    mx=tmp;  //更新答案            }            if(a[i+1]>1)  //如果第i个卷可以比之后的更短            {                tmp=c[i+1]+1;     //通过缩短i号卷可以使i之后的递增序列+1                if(a[i+1]-1>a[i-1])    tmp+=b[i-1];  //判断是否可以和之前的卷连在一起                if(tmp>mx)    mx=tmp;  //更新答案            }        }        printf("%d\n",mx);    }    return 0;}


0 0