• poj 3250 Bad Hair Day(单调队列)


    题目链接:http://poj.org/problem?id=3250

    思路分析:题目要求求每头牛看见的牛的数量之和,即求每头牛被看见的次数和;现在要求如何求出每头牛被看见的次数?

    考虑到对于某头特定的牛来说,看见它的牛一定在它的左边,另外其高度应该大于该牛的高度,所以只需要计算在其左边并高度大于它的牛的数目即可;

    考虑构建一个栈,在某头牛入栈时,弹出栈中高度小于它的牛,剩下的牛高度大于它,此时计算栈的长度就可以得到该牛被看见的次数。

    代码如下:

    #include<iostream>
    #include<stack>
    using namespace std;
    
    int main()
    {
        int n;
        int ans = 0;
        unsigned long height;
        stack<unsigned long>S;
    
        scanf( "%d", &n );
        scanf( "%d", &height );
        S.push( height );
        for ( int i = 1; i < n; i++ )
        {
            scanf( "%d", &height );
            while ( !S.empty() && S.top() <= height )
                S.pop();
            
            ans = ans + S.size();
            S.push( height );
        }
    
        while ( !S.empty() )
            S.pop();
    
        printf( "%u
    ", ans );
        return 0;
    }

    算法复杂度: O(N)

  • 相关阅读:
    window下启动tomcat输出日志乱码
    Mybatis
    JAVA-Stream
    记录-linux安装supervisor来监控elasticsearch
    草稿
    定时任务
    阿里云linux6.9 64位安装mysql5.7.23记录
    归并排序
    快速排序
    HTML DOM
  • 原文地址:https://www.cnblogs.com/tallisHe/p/3985298.html
Copyright © 2020-2023  润新知