COGS1212. 奶牛排队

奶牛在熊大妈的带领下排成了一条直队。  

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

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值