stack例题

该编程问题描述了一排面向右的奶牛,每只奶牛能看见其后面所有身高比它小的奶牛的‘发型’。给定每只奶牛的身高,目标是计算每只奶牛能看到的发型数量之和。提供的C++代码示例使用栈数据结构来解决此问题,通过不断比较奶牛的身高并更新计数器来得出答案。
摘要由CSDN通过智能技术生成

题目描述

Farmer John的奶牛在风中凌乱了它们的发型……

每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。

比如下面这个例子:

* * * * = *
= * * * = *
= * - * = * 奶牛面向这边-->
= * = * = *
= - = = = *
= = = = = =
1 2 3 4 5 6
('*'表示空的,这是译者为了格式特意弄的,原题没有)

令ci表示第i只奶牛能够看到的发型数量,请计算c1 + c2 + c3 + … + cN的值

对于上面这个例子,答案为3 + 0 + 1 + 0 + 1 + 0=5。

输入

第一行:奶牛数量N

第二到N+1行:第i+1行输入奶牛i的身高

输出

第一行:一个整数即c1到cN的和

样例输入

6

10

3

7

4

12

2

样例输出

5

#include<iostream>

#include<stack>

using namespace std;

const int N=1e6+10;

long long a[N];

int main(){

long long n;cin>>n;

for(int i=1;i<=n;i++)cin>>a[i];

stack<int>s;

s.push(a[1]);

long long k=0;

for(int i=2;i<=n;i++){

while(!s.empty()&&s.top()<=a[i])

s.pop();

k+=s.size();

s.push(a[i]);

}

cout<<k<<endl;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值