NOIP2012模拟试题 121105【奶牛排队(tahort)
3、奶牛排队(tahort)
【 问题描述】
奶牛在熊大妈的带领下排成了一条直队。
显然,不同的奶牛身高不一定相同……
现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A、B奶牛相同。问这样的奶牛最多会有多少头?
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。
【输入】
第一行一个数N (2≤N≤l00000),表示奶牛的头数。
接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高≤ maxlongint)。
【输出】
第一行,表示最多奶牛数。
【样例】
Tahort.in
5
1
2
3
4
1
Tahort.out
4
【样例解析】
取第1头到第4头奶牛,满足条件且为最多。
唔,注意两件事:
*1、不是最长不下降子序列啊喂!读题!(╯‵□′)╯︵┻━┻
*2、虽然这里用的是枚举+优化,但是标程是RMQ【懒得写
代码中已经有注释了=v=这里不再多说
1 #include<cstdio> 2 #include<cstring> 3 #include<ctime> 4 #include<algorithm> 5 using namespace std; 6 int n; 7 int ans=0; 8 long long h[100001]; 9 bool v[100001]; 10 void work() 11 { 12 memset(v,0,sizeof(v)); 13 for(int i=n;i>1;i--)//枚举右界 14 { 15 for(int j=i-1;j>=1;j--)//枚举左界 16 { 17 if(h[i]<=h[j]) break;//如果左界比右界大,不成立,退出; 18 bool flag=true; 19 for(int k=j+1;k<i;k++)//枚举左右界之间的数是否使当前情况成立; 20 { 21 if(h[k]<=h[j]||h[k]>=h[i])//不满足退出; 22 { 23 flag=false; 24 break; 25 } 26 } 27 if(flag) 28 { 29 ans=max(ans,i-j+1); 30 } 31 if(ans==n){//如果当前数列长度为 n,直接退出; 32 printf("%d ",ans); 33 return; 34 } 35 } 36 } 37 printf("%d ",ans); 38 } 39 void read() 40 { 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++) scanf("%lld",&h[i]); 43 } 44 int main() 45 { 46 freopen("tahort.in","r",stdin); 47 freopen("tahort.out","w",stdout); 48 read(); 49 work(); 50 return 0; 51 }