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