首页 > 代码库 > P1823 音乐会的等待
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 else53 {54 ans++;55 s.push(h);56 }57 }58 printf("%d",ans);59 }
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 }
P1823 音乐会的等待
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。