WXYZ与绿豆饼
Problem Description
WXYZ很喜欢吃绿豆饼,而且每次都能吃很多。但是担心WXYZ长的太胖,妈妈把买回来的一卷卷的绿豆饼排成一列(每卷绿豆饼的高度可能是不一样的),规定WXYZ只能取其中一段连续的并且高度严格上升的绿豆饼来吃。
可怜的WXYZ发现,根据这个规则,每次他只能拿到很少的绿豆饼,于是他想到了一个办法:趁妈妈不注意的时候改变某一卷绿豆饼的高度(压扁或拉长它)。WXYZ知道,这样就可以拿到一段长得多的连续的而且高度严格上升的绿豆饼了。
真是太聪明了!不过应该改变哪一卷绿豆饼的高度才能使得可以拿走的连续的一段高度严格上升的绿豆饼最多呢?嗯,这个问题就交给你了,如果你能成功解答说不定WXYZ会分给你一些绿豆饼呢。
注意:修改之后绿豆饼的高度最小为1,最大为10000,并且高度只能是整数。
可怜的WXYZ发现,根据这个规则,每次他只能拿到很少的绿豆饼,于是他想到了一个办法:趁妈妈不注意的时候改变某一卷绿豆饼的高度(压扁或拉长它)。WXYZ知道,这样就可以拿到一段长得多的连续的而且高度严格上升的绿豆饼了。
真是太聪明了!不过应该改变哪一卷绿豆饼的高度才能使得可以拿走的连续的一段高度严格上升的绿豆饼最多呢?嗯,这个问题就交给你了,如果你能成功解答说不定WXYZ会分给你一些绿豆饼呢。
注意:修改之后绿豆饼的高度最小为1,最大为10000,并且高度只能是整数。
Input
输入有多组测试数据,每组测试数据的第1行为一个正整数N(<=10000),表示有绿豆饼的卷数。
输入的第2行为N个正整数,表示这N卷绿豆饼的高度,两个正整数之间会有一个空格,高度值不会大于10000
输入的第2行为N个正整数,表示这N卷绿豆饼的高度,两个正整数之间会有一个空格,高度值不会大于10000
Output
对于每组测试数据输出一行,包括一个整数,表示修改之后最长的一段连续且高度严格上升的绿豆饼的长度。
Sample Input
6 6 1 2 2 4 4
Sample Output
4
1 #include <algorithm> 2 #include <cstdio> 3 using namespace std; 4 5 const int maxn=10005; 6 int N,h[maxn],b[maxn],c[maxn]; 7 8 int main() 9 { 10 int ans,temp,i; 11 while(~scanf("%d",&N)) 12 { 13 for (i=0; i<N; i++) scanf("%d",&h[i]); 14 b[0]=c[N-1]=1; 15 for(i=1; i<N; i++) 16 if(h[i-1]<h[i]) b[i]=b[i-1]+1; 17 else b[i]=1; 18 for(i=N-2; i>=0; i--) 19 if(h[i]<h[i+1]) c[i]=c[i+1]+1; 20 else c[i]=1; 21 ans=1; 22 if(N>1&&h[1]>1) ans=c[1]+1; 23 if(N>1&&h[N-2]<10000) ans=max(ans,b[N-2]+1); 24 for(i=1; i<N-1; i++) 25 { 26 if(h[i-1]<10000) 27 { 28 temp=b[i-1]+1; 29 if(h[i-1]+2<=h[i+1]) temp+=c[i+1]; 30 ans=max(ans,temp); 31 } 32 if(h[i+1]>1) 33 { 34 temp=c[i+1]+1; 35 if(h[i-1]+2<=h[i+1]) temp+=b[i-1]; 36 ans=max(ans,temp); 37 } 38 } 39 printf("%d\n",ans); 40 } 41 42 return 0; 43 }