编程题解析-发型糟糕的一天

来源:互联网 发布:达芬奇调色软件12.5 编辑:程序博客网 时间:2024/06/10 06:04

题目描述
题目来自www.openjudge.cn,标题叫做“发型糟糕的一天”,题目描述详见http://stepbystep.openjudge.cn/stackqueue/11/
题目的总时间限制: 2000ms 单个测试点时间限制: 1000ms。

错误解法
采用以下结构的两重循环的话,将发生超时现象。
for (i = 0; i < N; i++)
 for(j = i + 1; j < N; j++)
  如果奶牛i可以看到奶牛j,则计数器加1;

解题思路
不去统计每一头奶牛能看到前方多少头奶牛;而是去统计一头奶牛能被后方多少头奶牛看见。所有能看见奶牛i的奶牛的高度必定形成一个单调递减序列,且高度大于奶牛i的高度。
我们用堆栈来存储单调递减序列。若奶牛i的高度为h[i],那么把栈顶部所有高度小于等于h[i]的元素都弹出(因为按题意,这些奶牛是无法看到奶牛i的),余下的元素个数就是能够看到奶牛i的奶牛的数目。

代码实现

#include <iostream>#include <stack>using namespace std;int main(){    int cowNum;    cin >> cowNum;    stack<long> cows;    long result = 0;    for (int i = 0; i < cowNum; i++)    {        long h;        cin >> h;        while (!cows.empty() && h >= cows.top())            cows.pop();        result += cows.size();        cows.push(h);    }    cout << result << endl;}
0 0