acwing 600. 仰视奶牛

题目地址  https://www.acwing.com/problem/content/description/602/

约翰有N头奶牛,编号为1到N。

现在这N头奶牛按编号从小到大的顺序站成了一排,其中奶牛 i 的身高为HiHi。

现在,每头奶牛都向它的右侧望向那些编号较大的奶牛,对于奶牛 i 如果存在一头奶牛 j 满足 i<ji<j 并且 Hi<HjHi<Hj,那么我们称奶牛 i 需要仰视奶牛 j。

请你求出每头奶牛的最近仰视对象。

输入格式

第一行包含整数N。

接下来N行,每行包含一个整数HiHi,其中第 i 行的数为编号为 i 的奶牛的高度。

输出格式

共 N 行,每行输出一个整数,其中第 i 行的输出整数表示编号为 i 的奶牛的最近仰视对象的编号,如果不存在仰视对象,则输出0。

数据范围

1N1e5
1Hi1e6

 

复制代码
输入样例:
6 
3 
2 
6 
1 
1 
2 
输出样例:
3 
3 
0 
6 
6 
0 
复制代码

 

 

单调栈记录最近的未仰视的牛编号(有仰视的答案已经记录了 出栈)

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <stack>
 4 
 5 
 6 using namespace std;
 7 
 8 const int N = 1e5+100;
 9 
10 vector<int> arr(N,0);
11 vector<int> ans(N,0);
12 stack<int> st;
13 int n ;
14 
15 int main()
16 {
17     cin >> n;
18     for(int i =1;i<= n;i++){
19         cin >> arr[i];
20     }
21     
22     for(int i =1;i <= n;i++){
23         while(!st.empty() && arr[i]>arr[st.top()]){
24             ans[st.top()] = i;
25             st.pop();
26         }
27         
28         st.push(i);
29     }
30     
31     while(!st.empty()){
32          ans[st.top()] = 0;
33          st.pop();
34     }
35     
36     for(int i = 1 ;i<=n;i++){
37         cout << ans[i] << endl;
38     }
39     
40     
41     return 0;
42 }
View Code
复制代码

 

posted on   itdef  阅读(220)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2016-05-24 字典类的代码的学习

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示