计蒜客 数据结构 栈 模板倒水问题
2016-08-12 15:20
330 查看
//单调递减栈 //题目: //我们来看看这样一道题:地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,(10,5,8,12,6) //如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板, //现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水, //直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没), //求 n 次操作后,所有 ai 的和是多少。 //如图上所示,在第 4 块木板右侧倒水,可以淹没第 5 块和第 6 块一共 2 块木板,a4 = 2。 //例如 n = 5,每块木板高分别为 10,5,8,12,6。sum 记录最后的结果,初始为 0。 //第 1 块木板高 10,栈为空,10 入栈; //第 2 块木板高 5,栈顶为 10,5 入栈; //第 3 块木板高 8,栈顶 5 比 8 小,删除栈顶,a2 为 3 - 2 - 1 = 0,sum = 0。此时栈顶为 10,8 入栈; //第 4 块木板高 12,栈顶 8 比 12 小,删除栈顶,a 3为 4 - 3 -1 = 0,sum = 0。此时栈顶为 10 比 12 小,继续删 除栈顶, //a1 为 4 - 1 - 1 = 2,sum = 2。此时栈为空 ,12 入栈。 //第 5 块木板高 6,栈顶为 12,把 6 加入栈中。 //遍历结束后,栈不为空,依次删除栈顶,当前位置为 n + 1,栈顶是第 5 个元素 6,a5 为 6 - 5 - 1 = 0,sum = 2。 //删除栈顶,此时栈顶是第 4 个元素 12,a 4为 6 - 4 - 1 = 1,sum = 3。此时栈为空,得到 sum 为 3,程序结束。 #include<iostream> #include<cassert> using namespace std; class Node { public: int id, height; }; template<class Type> class Stack { private: Type *urls; int max_size, top_index; public: Stack(int length_input) { urls = new Type[length_input]; max_size = length_input; top_index = -1; } ~Stack() { delete[] urls; } bool push(const Type &element) { if (top_index >= max_size - 1) { return false; } top_index++; urls[top_index] = element; return true; } bool pop() { if (top_index < 0) { return false; } top_index--; return true; } Type top() { assert(top_index >= 0); return urls[top_index]; } bool empty() { if (top_index < 0) { return true; } else { return false; } } }; int main() { //n表示有n块木板,ans用来记录最后的结果 int n, ans = 0; cin>>n; //定义node类型的栈stack长度为n Stack<Node> stack(n); Node temp; for(int i = 1; i <= n;i++){ //C++中->左侧一定是指针,.的左侧是实体 cin>>temp.height; temp.id = i; while(!stack.empty() && stack.top().height <= temp.height){ ans = ans + i - stack.top().id - 1; stack.pop(); } stack.push(temp); } while(!stack.empty()){ // stack.pop(); ans = ans + n + 1 - stack.top().id - 1; stack.pop(); } cout<<ans<<endl; return 0; }
相关文章推荐
- 计蒜客 机器人的相遇问题(扩展欧几里得模板题)
- 模板机制的问题
- 一个关于xslt的模板匹配规则的问题
- RadioButton加入DataGrid模板列引起的问题。
- Linux内核中关于数据结构操作的一个问题
- 关于DataGrid的头模板的绑定问题_AX
- 转贴:关于C++模板和重载的小问题
- DetailsView中模板列的一个问题:ViewState异常 "Failed to load viewstate"
- C++对模板的分离式编译问题
- 关于动态生成列的DATAGRID不能出发模板列的时间问题
- 关于后台生成的模板列的数据绑定问题
- 关于C++模板和重载的小问题
- Struts+Hibernate模板开发笔记---解决汉字编码问题
- 关于C++模板封装的问题(关于C++模板参数的声明)
- CArray 模板使用时应注意的问题.
- 关于C++模板和重载的小问题
- 恶补算法与数据结构(一)——排列问题
- [c#算法和数据结构]约瑟夫环问题
- 关于C++模板编译不了的问题
- Cache 和 模板的问题