POJ 3250 Bad Hair Day (栈的简单应用)

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

题意:一排全都向右看齐的牛,第 i 头牛可以看到在它右边且比它低的不被比它高的牛所遮挡的牛。问1~n头能看见的和。

刚开始我用最基础的方法写,但是超时了,当然poj也不会出这样简单的水题.太天真了。


超时代码。

#include<cstdio>

__int64 a[80005],ans;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n; i++)
        scanf("%I64d",&a[i]);

    ans = 0;

    for(int i = 0;i < n; i++){
        for(int j = i + 1;j < n; j++){

            if(a[i] > a[j])
                ans++;
            else break;

        }
    }

    printf("%I64d\n",ans);

    return 0;

}

后来发现可以用栈的数组模拟来写。

思路:只要每次把比输入的一头牛低的或者等于它的牛去掉,那么栈中剩余的牛便是能看见这头牛的数量。


#include<cstdio>

__int64 Stack[80005],ans,top;

int main()
{
 //   freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);

    ans = 0;
    top = 0;

    for(int i = 0;i < n; i++){
        __int64 num;
        scanf("%I64d",&num);

        while(top > 0 && Stack[top-1] <= num) top--;

        ans += top;

        Stack[top++] = num;

    }

    printf("%I64d\n",ans);

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值