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对人可以互相看见。

    /*基础的n-1对,然后用栈维护大小,保证大前小后,若不满足*/
    /*把比当前数小的数弹出来,加上它们的数量*//*然而这是错的*/
    /*正解也是栈,但是处理方式不同*/
    /*当一个身高比栈顶高的人要进栈时,先将栈中所有身高比他矮的人弹掉*/
    /*对于一样高的要特殊考虑,他们不会阻碍视线,因此弹出去后要再加上*/
    #include<cstdio>
    #include<algorithm>
    #define maxn 500001
    using namespace std;
    int stack[maxn];
    int top=0; 
    int read()
    {
        int now=0;
        int f=1;
        char c=getchar();
        while(c>'9'||c<'0')
        {
            if(c=='-')f=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9')
        {
            now*=10;
            now+=c-'0';
            c=getchar();
        }
        return now*f;
    }
    int main()
    {
        int n=read();
        int tot=0;
        for(int i=1;i<=n;i++)
        {
            int op=read();
            int co=1;
            while(op>stack[top]&&top>0)
            {
                top--;
                tot++;
            }
            while(op==stack[top]&&top>0)
            {
                top--;
                tot++;
                co++;
            }
            if(top!=0)tot++;
            top+=co;
            stack[top]=op;
        }
        printf("%d",tot);
        return 0;
    }
  • 相关阅读:
    C# 窗体WinForm中动态显示radioButton实例
    C#和Java交互相关研究
    c# 注册表操作,创建,删除,修改,判断节点是否存在
    C#单例模式的三种写法
    C#中使用TCP通信
    c#中this的用法
    C#单例模式的三种写法
    二十道经典C#面试题
    Linux chattr 命令详解
    Linux ulimit命令详解
  • 原文地址:https://www.cnblogs.com/luoyibujue/p/6886269.html
Copyright © 2011-2022 走看看