时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
有N个蚂蚁兄弟从左到右排成一行,每个蚂蚁见到比自己岁数大的蚂蚁就称为大哥。现在每只蚂蚁都先左看,寻找最近的大哥。找不到时输出0。
请编一个程序,帮助蚂蚁们计算每只蚂蚁的最近大哥是哪个?
输入
第一行2个正整数:N,N的范围是[1…100000]。
第二行:N个正整数,表示每只蚂蚁的年龄,每个数的范围是[0…1,000,000,000]。
输出
一行,N个整数,表示相应蚂蚁的最近大哥的编号。编号从1到N。
样例输入 Copy

6
8 6 3 3 5 1

样例输出 Copy

0 1 2 2 2 5

题意很简单,就是求数组中任意元素的左边首次出现的比它大的元素的编号,如果找不到就输出0。
一开始我寻找后一个元素与前一个元素的大小关系,结果WA了。。。
后来想了很久,没有思路,上网查阅解决这类问题的相关资料后得知采用栈来处理,而且是单调栈。
单调栈就是栈底到栈顶的元素按升序或降序排列的栈,在普通的栈的基础上对进栈元素有了要求——必须单调。
这个题我们可以采用栈底到栈顶元素降序排列的单调栈。先遍历数组,如果栈为空,则元素进栈;如果栈不为空且当前元素不小于栈顶元素,栈顶元素出栈,直到当前元素大于等于栈顶元素。该循环结束后,一定满足当前元素大于等于栈顶元素,因此当前元素进栈,同时注意到此时的栈顶元素就是当前元素的左边首次出现的比它大的元素
接下来就是我感觉比较麻烦的地方。。。
题目要输出编号,在遍历、进栈、出栈的过程中,不方便用一个变量记录栈顶元素的编号,实现起来及其麻烦。如果我们用一个结构体记录元素的大小和编号,并且定义一个结构体类型的栈,这个问题就能完美解决。

#include<cstdio>
#include<stack>
using namespace std;
struct ant
{int age;int index;
}a[100005];
stack<ant>num;//结构体类型的栈
int ans[100005];
int main()
{int n,i;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i].age);//大小a[i].index=i;//编号}for(i=1;i<=n;i++){while(!num.empty()&&a[i].age>=num.top().age)//为保证单调栈,先弹出不满足单调型的元素,最后再进栈{num.pop();}if(!num.empty())//存在栈顶元素比当前元素大{ans[i]=num.top().index;}else//栈为空,则找不到栈顶元素比当前元素大{ans[i]=0;}num.push(a[i]);}for(i=1;i<=n;i++){printf("%d",ans[i]);if(i<n)printf(" ");}return 0;
}
/**************************************************************Language: C++Result: 正确Time:47 msMemory:3116 kb
****************************************************************/

最近的大哥(单调栈)相关推荐

  1. 2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈

    秋实大哥去打工 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  2. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  3. 【单调栈 前缀和 异或】7.21序列求和

    还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...

  4. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

  5. 栈与队列7——单调栈结构(初阶问题)

    题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...

  6. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  7. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  8. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  9. 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)

    整理的算法模板合集: ACM模板 目录 1. NC 打铁的箱子(规律 + 二进制) 2. NC 最优屏障(单调栈 + 前缀和,后缀和) 3. CF993C Careful Maneuvering(bi ...

最新文章

  1. MVC,MVP 和 MVVM 的图示
  2. html css float left与 float right的使用说明
  3. 用js实现表格行的动态添加与删除
  4. jdk8lambda_JDK8 lambda的会话指南–术语表
  5. 程序员35岁真的是分水岭吗?小白也能看明白
  6. IT草根的江湖之路之五:鉴于现实,屈服!
  7. 计算机编程英语词汇app,计算机编程英语词汇
  8. SAP 特殊字符的处理CL_ABAP_CHAR_UTILITIES(去除多余的换行符、换页符、Tab符)
  9. Vue.js:从安装到快速创建脚手架项目,解决刚创建完出现的parsing error:No Bable config file detected报错
  10. 万万没想到,“红孩儿”竟然做了程序员,还是CTO!
  11. 集合之比较接口器+Map家族的HashMap+LinkedHashMap+Hashtable+ConcurrentHashMap
  12. JavaScript返回上一页后并刷新页面
  13. 实力肯定!Coremail邮件网关荣获金融信创优秀解决方案奖
  14. 龙族幻想最新东京机器人位置_龙族幻想藤原智坐标位置一览 藤原智任务攻略...
  15. 三分钟告诉你为什么再昂贵的普洱茶都只是用棉纸包装?
  16. s2sh整合(详细版)
  17. 傻妞机器人新版安装教程
  18. 锐化 清晰度 对比度的区别
  19. 学习笔记:SKU组件(React版)
  20. 文华财经-wh8-MTM动力指标

热门文章

  1. 可供参考的互联网电商订单中心设计
  2. 192.168.2.0/24后面的/24表示什么意思
  3. 《Gliding vertex on the horizontal bounding box for multi-oriented object detection》算法详解
  4. 201671010434王雯涵--实验三:作业互评与改进
  5. 新品项目交付频繁 猿团开启APP快速开发新模式
  6. iOS开发-点击屏幕,键盘消失的极佳方法。
  7. c语言程序电机,直流电机控制C语言程序
  8. Atitit 旅游强县城 名单列表 旅游资源但其实,北上广深大概只占全国面积的0.33%,加上新一线城市,也只是占了全国面积的3%。在剩下的97%的土地上,有着约300个地级市,3000个
  9. 个人习惯养成的简单公式
  10. 四六级重要单词(二)