http://poj.org/problem?id=3250

 题意 :  n个牛排成一列向右看,牛 i 能看到牛 j 的头顶,当且仅当牛 j 在牛 i 的右边并且牛 i 与牛 j 之间的所有牛均比牛 i 矮。 设牛 i 能看到的牛数为ni,求ni的和。

思路 : 表示一开始就想用数组去操作,结果说是会超时,问了别人的才知道原来要用栈啊,用栈保存,新的元素若是比栈顶元素大,就把栈里小于新元素的弹出栈

#include<cstdio>
#include<cstring>
#include<stack>
#include<iostream>
using namespace std ;
int main()
{
    int n ;
    scanf("%d",&n) ;
    stack<long long>Q;
    long long cnt = 0 ;
    int a;
    scanf("%d",&a) ;
        Q.push(a) ;
    for(int i = 1 ; i < n ; i++)
    {
        scanf("%d",&a) ;
        while(!Q.empty()&&a>=Q.top())
        {
            Q.pop();
        }
        cnt += Q.size();
        Q.push(a) ;
    }
    printf("%lld\n",cnt) ;
    return 0 ;
}
View Code

 

posted on 2013-08-24 15:26  枫、  阅读(134)  评论(0编辑  收藏  举报