zoukankan      html  css  js  c++  java
  • WOJ1109 奶牛排队

    题目链接:###

    WOJ1109

    题目描述:###

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

    输入
    第一行一个数N(2<=N<=100000),表示奶牛的头数。 接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1<=身高<=maxlongint)。

    输出
    一行,表示最多奶牛数。

    分析:###

    维护一个单减的单调栈,读入一个数x时,如果单调栈顶的数比x更小,就弹出这个数(设为xi),而如果x当前可延伸的左端点值比xi的左端点值更大,就用xi可以延伸到的最左端的端点更新x的最左端的端点(值和编号都要更新)(xi<x,所以xi如果能延伸到左端点xj,则x一定也能延伸到左端点j)弹完压入x并更新ans=r_id-l_id+1
    如果ans1则说明r_idl_id,这种情况是不合法的(相当于A==B),把ans更改为0
    输出ans


    代码:###

    #include<bits/stdc++.h>
    #define MAXN (100000+5)
    using namespace std;
    inline int read(){
        int f=1,cnt=0;char c;
        c=getchar();
        while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
        while(isdigit(c)){cnt=cnt*10+c-'0';c=getchar();}
        return cnt*f;
    }
    struct node{int ldat;int rdat;int lid;int rid;}sta[MAXN],x;
    int n;
    int top=0;
    int ans=-1;
    int main(){
    	n=read();
    	for(register int i=1;i<=n;i++){
    		x.rdat=read();x.ldat=x.rdat;
    		x.lid=x.rid=i;
    		while(x.rdat>sta[top].rdat&&top){
    			if(x.ldat>sta[top].ldat){
    				x.ldat=sta[top].ldat;
    				x.lid=sta[top].lid;
    			}
    			top--;
    		}
    		sta[++top].ldat=x.ldat;
    		sta[top].rdat=x.rdat;
    		sta[top].lid=x.lid;
    		sta[top].rid=x.rid;
    		if(ans<sta[top].rid-sta[top].lid+1)ans=sta[top].rid-sta[top].lid+1;
    	}
    	if(ans==1)ans=0;
    	printf("%d",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    生产环境经常用到的命令
    JDK 安装部署
    oracle备份脚本
    HTTP与HTTPS的区别
    TCP和UDP的优缺点及区别
    Web服务器优化
    DDOS攻击的三种常见方式
    Xss Csrf DDOS sql注入及防范
    session共享
    Cookie防伪造防修改
  • 原文地址:https://www.cnblogs.com/kma093/p/10292900.html
Copyright © 2011-2022 走看看