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;
}