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

    说明

    数据制作: @w

    这道题一开始自己推出来了如果后面有比他大的那么这个数是没用的,

    然后乱搞了一下搞了25分。。。

    看了一下题解发现一个非常好的思路

    就是把相等和大于放到一个循环里判断,

    一开始num==1保证有数据读入

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<stack>
     6 using namespace std;
     7 int read(int & n)
     8 {
     9     char c='-';int x=0;
    10     while(c<'0'||c>'9')c=getchar();
    11     while(c>='0'&&c<='9')
    12     {
    13         x=x*10+(c-48);
    14         c=getchar();
    15     }
    16     n=x;
    17 }
    18 const int MAXN=500001;
    19 stack<int>s;
    20 int main()
    21 {
    22     int n,h,ans=0,flag=0;
    23     read(n);
    24     for(int i=1;i<=n;i++)
    25     {
    26         flag=0;
    27         read(h);
    28         if(i==1)
    29         {
    30             s.push(h);
    31             continue;
    32         }
    33         if(h>s.top())
    34         {
    35             ans++;
    36             s.pop();
    37             while(s.size()>0&&h>s.top())
    38             {
    39                 ans++;
    40                 s.pop();
    41                 flag=1;
    42             }
    43             if(s.size()!=0&&h<s.top())
    44             ans++;
    45             s.push(h);
    46         }
    47         else if(h==s.top())
    48         {
    49             ans=ans+s.size();
    50             s.push(h);
    51         }
    52         else
    53         {
    54             ans++;
    55             s.push(h);
    56         }
    57     }
    58     printf("%d",ans);
    59 }
    乱搞25分
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<stack>
     6 using namespace std;
     7 int read(int & n)
     8 {
     9     char c='-';int x=0;
    10     while(c<'0'||c>'9')c=getchar();
    11     while(c>='0'&&c<='9')
    12     {
    13         x=x*10+(c-48);
    14         c=getchar();
    15     }
    16     n=x;
    17 }
    18 const int MAXN=500001;
    19 stack<int>s;
    20 int main()
    21 {
    22     int n,h,ans=0,flag=0;
    23     read(n);
    24     for(int i=1;i<=n;i++)
    25     {
    26         int num=1;
    27         read(h);
    28         while(s.size()!=0&&h>=s.top())
    29         {
    30         
    31             if(h==s.top())
    32             num++;
    33             ans++;
    34             s.pop();
    35         }    
    36         if(s.size()!=0)
    37         ans++;
    38         while(num--)
    39         s.push(h);
    40     }
    41     printf("%d",ans);
    42 }
  • 相关阅读:
    NX二次开发-获得制图中对象的坐标点UF_DRF_ask_origin
    string的find("")
    NX二次开发-设置尺寸的附加尺寸UF_DRF_set_appended_text
    NX二次开发-获取尺寸的附加文本UF_DRF_ask_appended_text
    NX二次开发-更改图纸尺寸内容(编辑文本)uc5566
    NX二次开发-获取工程图尺寸的值UF_DRF_ask_dim_info
    MFC进度条
    NX二次开发-对话框解锁UF_UI_unlock_ug_access
    NX二次开发-对话框加锁UF_UI_lock_ug_access
    <转载>深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7040712.html
Copyright © 2011-2022 走看看