zoukankan      html  css  js  c++  java
  • 洛谷 P1823 音乐会的等待

    题目描述

    N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。

    写一个程序计算出有多少对人可以互相看见。

    输入输出格式

    输入格式:

    输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

    接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

    输出格式:

    输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

    输入输出样例

    输入样例#1: 复制
    7 
    2 
    4 
    1 
    2 
    2 
    5 
    1
    输出样例#1: 复制
    10

    首先不得不说一下,这题很恶心,需要判断很多种情况。首先对于整个序列,我们可以用一个单调不增的栈来维护,然后在分情况讨论一下。
    当要加进去的数比栈顶小时,直接加进去,对答案的贡献是1;与栈顶相等时,我们需要找出总共有多少与之相等的数,然后对答案的贡献就是这些数的个数,如果还有比它大的数,那么答案还要+1。大于栈顶
    就按照单调栈的原则弹栈,每次弹出一个元素就答案+1,最后到不能弹了,再判断有没有与之相等的数,如果有,方法同上。
    PS:这题相当考验智力。。然而我智商不够就算了吧233
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    using namespace std;
    const int maxn=5e5+10;
    int read()
    {
        int ret=0,f=1;
        char c=getchar();
        while(c<'0'||c>'9')
        {if(c=='-') f=-1;c=getchar();}
        while(c>='0'&&c<='9')
        {ret=ret*10+c-'0';c=getchar();}
        return ret*f;
    }
    long long ans=0;
    int n;
    int stk[maxn],top=0;
    inline void push(int x)
    {
        stk[++top]=x;
    }
    inline void pop()
    {
        if(top) top--;
    }
    int main()
    {
        n=read();
        int x;
        for(int i=1;i<=n;i++)
        {
            x=read();
            int t=0;
            while(top&&x>stk[top]) ans++,pop();
            while(top&&x==stk[top]) ans++,pop(),t++;
            if(top) ans++;
            top+=t;
            push(x);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
    
    
     
  • 相关阅读:
    PHP调试总结
    vim常用命令
    Xshell
    JavaScript
    HTML+CSS
    解决VMware“该虚拟机似乎正在使用中”问题
    MVC dirname(——FILE——)
    各种编程语言中的指针和引用
    Go defer 原理和源码剖析
    软件架构定义的流派
  • 原文地址:https://www.cnblogs.com/loi-frank/p/7763822.html
Copyright © 2011-2022 走看看