编程题解析-发型糟糕的一天
2015-10-02 16:47
886 查看
题目描述
题目来自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的奶牛的数目。
代码实现
题目来自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; }
相关文章推荐
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
- python-文件读取
- 【C语言】双向链表的实现
- 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表
- [C/C++]重读《The C Programming Language》
- C语言之关键字、宏定义、条件编译
- jasperReport生成html图片显示问题
- C#方法参数--值参数,引用参数,输出参数
- JAVA设计模式之工厂模式
- lua userdata
- Java进阶(一)JDBC
- 《php和mysql web开发》笔记——第10章 使用MySQL数据库
- Python基础
- GO RPC
- 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
- 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
- 静态编译Qt5.4.1和Qt WebKit
- 错误: 找不到或无法加载主类
- C# 获取操作系统相关信息
- C#反射技术的简单操作