向右看齐Look Up

向 右 看 齐   L o o k   U p 向右看齐\ Look\ Up  Look Up

题目链接:luogu P2947

题目

约翰的 N ( 1 ≤ N ≤ 1 0 5 ) N(1≤N≤10^5) N(1N105)头奶牛站成一排,奶牛 i i i的身高是 H i ( l ≤ H i ≤ 1 , 000 , 000 ) H_i(l≤H_i≤1,000,000) Hi(lHi1,000,000)。现在,每只奶牛都在向右看齐.对于奶牛 i i i,如果奶牛 j j j满足 i &lt; j i&lt;j i<j H i &lt; H j H_i&lt;H_j Hi<Hj,我们可以说奶牛 i i i可以仰望奶牛 j j j. 求出每只奶牛离她最近的仰望对象

输入

1 1 1 行输入 N N N,之后每行输入一个身高 H i H_i Hi

输出

N N N 行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出 0 0 0

样例输入

6 
3 
2 
6 
1 
1 
2 

样例输出

3 
3 
0 
6 
6 
0 

样例解释

6 6 6 头奶牛的身高分别为 3 3 3, 2 2 2, 6 6 6, 1 1 1, 1 1 1, 2 2 2.
奶牛 1 1 1 2 2 2 仰望奶牛 3 3 3,奶牛 4 4 4 5 5 5 仰望奶牛 6 6 6,奶牛 3 3 3 6 6 6 没有仰望对象。

数据范围

对于 20 % 20\% 20%的数据: 1 ≤ N ≤ 10 1≤N≤10 1N10
对于 50 % 50\% 50%的数据: 1 ≤ N ≤ 1 , 000 1≤N≤1,000 1N1,000
对于 100 % 100\% 100%的数据: 1 ≤ N ≤ 100 , 000 1≤N≤100,000 1N100,000 1 ≤ H i ≤ 1 , 000 , 000 1≤H_i≤1,000,000 1Hi1,000,000

思路

这道题就是一道单调栈。
每次读入时就判断判断是否会被仰望,(枚举每一次的栈顶,不会就退出,会就把那个数出栈),然后把读入的数进栈。
最后我们输出所记录的仰望对象,就可以了。

代码

#include<cstdio>
using namespace std;
int n,a,ans[100001],num;
struct note
{
	int num,tall;
}f[100001];
int main()
{
	scanf("%d",&n);//读入
	num=1;//初始化
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a);//读入
		while (a>f[num-1].tall&&num>1)
		{
			ans[f[num-1].num]=i;//找仰望对象
			num--;//出栈
		}
		f[num++]=(note){i,a};//入栈
	}
	for (int i=1;i<=n;i++)
		printf("%d\n",ans[i]);//输出
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值