1 条题解

  • 0
    @ 2024-10-27 21:00:35

    这是一道很典型的栈问题,

    #include<bits/stdc++.h>
    using namespace std;
    int n, h[100010], ans[100010];
    stack<int>st;
    int main() {
    	cin >> n;
    	for (int i = 1; i <= n; i++) cin >> h[i];
    	for (int i = n; i >= 1; i--) {
    		while (!st.empty() && h[st.top()] <= h[i])st.pop();
    		if (st.empty())ans[i] = 0;
    		else ans[i] = st.top();
    		st.push(i);
    	}
    	for (int i = 1; i <= n; i++) {
    		cout << ans[i] << endl;
    	}
    	return 0;
    }
    

    核心就是反向遍历,先判断栈里面是否有大于自己的元素,如果栈顶元素小于自己,则删除(因为第i个已经比后面栈顶的大,所以要是挡住i前面的·视野也肯定是第i个先挡住),然后后面判断栈是否为空,空就代表没有大于第i个学生的身高,就给ans[i]=0,如果不为空,就给ans[i]=st.top()(这是弹出栈顶元素,就是第一个大于h[i]的数)。

    • 1

    信息

    ID
    122
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    71
    已通过
    25
    上传者