hm 与 zx 的故事系列1/2/3

题意:从首位开始,找到在其后的最近的每一位的比它大的数;

解析;

使用栈(stack)进行存储满足条件的值;从最后一个数进行入栈,当栈顶数大于当前位置时跳出此时循环(即证明,在当前位置后有至少一个比它大的数,而栈顶的值是最近的),否则进行出栈(即此时栈内值小于当前位置,当最后栈为空时,代表在当前位置后没有比它大的值,所以当前位置的值为0),最后将此时位置的值压入栈底;执行到最后,即刻筛出满足题意所有的值;

#include<iostream>
#include<cstdio>
#include<stack>

using namespace std;

typedef long long LL;
const int maxn = 1000005;
LL num[ maxn ];

int main(){
	int n, temp;
	while( scanf( "%d", &n ) != EOF ){
		stack< int > Q;
		for( int i = 1; i <= n; ++i ){
			scanf( "%lld", &num[ i ] );
		}
		for( int i  = n; i > 0; --i ){
			temp = num[ i ];
			while( !Q.empty() && Q.top() <= num[ i ] )
				Q.pop();
			if( Q.empty() )
				num[ i ] = 0;
			else
				num[ i ] = Q.top();
			Q.push( temp );
		}
		for( int i = 1; i <= n; ++i )
			printf( "%lld\n", num[ i ] );
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值