您的位置:首页 > 大数据 > 人工智能

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

2016-08-28 09:47 295 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stack