zoukankan      html  css  js  c++  java
  • 单调栈3_水到极致的题 HDOJ4252

    A Famous City

    题目大意 给出正视图  每一列为楼的高度 最少有几座楼

    坑点 楼高度可以为0 代表没有楼

    贡献了两发RE 原因 if(!s.empty()&&tem){s.push(tem); continue;}并不能筛去 空栈且 tem为0的情况

    改为 if(!s.empty()){if(tem) s.push(tem); continue;} 后AC

    题目思路 维护一个单调递增的栈  假如新加入的楼高度小于top元素 那我们知道top元素一定是单独的一栋楼 我们就pop掉 ans++

    如果 等于top 那么可以认为 这两个是一栋楼(最少)

    如果大于pop  就添加下一个

    操作结束后 剩余在栈内的元素 每一个必然是独立的一栋楼

    楼的高度0 一定要特判

    对栈进行top pop 这些操作前一定要判empty啊

    代码如下

    #include<cstdio>
    #include<map>
    //#include<bits/stdc++.h>
    #include<vector>
    #include<stack>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<cstdlib>
    #include<climits>
    #define PI acos(-1.0)
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    typedef __int64 int64;
    const ll mood=1e9+7;
    const int64 Mod=998244353;
    const double eps=1e-9;
    const int N=2e7+10;
    const int MAXN=1e5+5;
    inline void rl(ll&num){
        num=0;ll f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    inline void ri(int &num){
        num=0;int f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    int getnum()//相邻的个位整数输入 如想分别保存1234 输入连续的1234 a[i]=getnum();就可以实现
    {
        char ch=getchar();
        while((ch<'0' || ch>'9') && ch!='-')
            ch=getchar();
        return (ch-'0');
    }
    inline void out(int x){ if(x<0) {putchar('-');  x*=-1;}if(x>9) out(x/10);    putchar(x%10+'0'); }
    int main()
    {
    
       int n,ci=0;
       while(scanf("%d",&n)!=EOF)
       {
           int tem;
           ll ans=0;
           stack<int>s;
           for(int i=0;i<n;i++)
           {
               ri(tem);
               if(s.empty())
               {
                   if(tem)s.push(tem);
                   continue;
               }
               if(s.top()==tem) continue;
               if(tem<s.top())
               {
                   while(!s.empty()&&s.top()>tem)
                   {
                       s.pop();
                       ans++;
                   }
                   if(!s.empty()&&s.top()==tem) continue;
                   else{
                      if(tem)s.push(tem);
                   }
               }
               else{
                    if(tem)s.push(tem);
               }
           }
           printf("Case %d: ",++ci);
           ans+=s.size();
           cout<<ans<<endl;
       }
       return 0;
    }
    AC代码
  • 相关阅读:
    [转载] 浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
    JQuery 备忘
    HTML实体符号代码速查表(转载)
    37、IFE任务12——学习CSS 3的新特性
    36、IFE任务35——听指令的小方块(三)
    35、IFE任务34——听指令的小方块(二)
    34、互联网的三次革命及三个阶段
    33、任务三十三——棋盘的实现、正方体的移动效果
    32、任务三十二——实现表单工厂
    31、任务三十一——表单联动
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/5444885.html
Copyright © 2011-2022 走看看