POJ3250 牛的视野(单调栈)

题意:一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛和后面的其他牛的发型。
给出这些牛的高度,要求每头牛可以看到的牛的数量的和。
思路:计算每头牛可以看到牛的头数,可以等效于每头牛可以被看到的次数

从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量,求和就是答案。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  //小根堆特有头文件
typedef long long ll;
#define N 1005
using namespace std;

int main()
{
    int n;
    while(scanf("%d",&n)==1){
        int num;
        ll sum=0;
        scanf("%d",&num);
        stacks;
        while(!s.empty())
            s.pop();
        s.push(num);
        for(int i=1;i=s.top()) //当前牛小于栈顶
                s.pop();
            sum+=s.size();
            s.push(num);
        }
        printf("%lld\n",sum);
    }
    return 0;
}



你可能感兴趣的:(ACM_C++,STL,数据结构,POJ)