您的位置:首页 > 其它

COGS1212. 奶牛排队

2017-05-13 13:40 218 查看
奶牛在熊大妈的带领下排成了一条直队。  

显然,不同的奶牛身高不一定相同……

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A、B奶牛相同。问这样的奶牛最多会有多少头?
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。


【输入格式】

第一行一个数N (2≤N≤100000),表示奶牛的头数。

接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高= maxlongint)。


【输出格式】

一行,表示最多奶牛数。


【样例输入】

5
1
2
3
4
1


【样例输出】

4


【提示】

样例解析,取第1头到第4头奶牛,满足条件且为最多。

题解:

维护一个单调递减的单调队列/单调栈 每次插入高度时 若队中已有高度低于这头牛的牛 就判断队中牛能向左延伸到的那头牛能否被这头牛延伸到 (特判高度相等的) 然后每个位置计算答案并更新

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct statype{
int bhei,bpos,ahei,apos;
}sta[100010];
int top=-1;
int main(){
freopen("tahort.in","r",stdin);
freopen("tahort.out","w",stdout);
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
top++;
cin>>sta[top].bhei;
sta[top].ahei=sta[top].bhei;
sta[top].bpos=i;
sta[top].apos=i;
while(sta[top].bhei>sta[top-1].bhei&&top>=1){
if(sta[top].ahei>sta[top-1].ahei){
sta[top].ahei=sta[top-1].ahei;
sta[top].apos=sta[top-1].apos;
}
sta[top-1]=sta[top];
top--;
}
if(ans<sta[top].bpos-sta[top].apos+1)
ans=sta[top].bpos-sta[top].apos+1;
}
if(ans==1)
ans=0;
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: