摘要:
有n只羊,(姑且算是羊吧,也有可能是牛啊猫啊什么之类的),每只羊都有一个身高,前面的羊要看到后面的羊的条件是,后面的羊高度要小于前面的羊,就问各位羊加起来看到的牛多少只.......#include#include#includeusing namespace std;int main(){ int n; while(scanf("%d",&n)>0) { stackQ; __int64 num,sum=0; scanf("%I64d",&num); Q.push(num); for(int i=1;i<n;i++) { sc 阅读全文
摘要:
题意:给出连续的矩形的高....求最大面积#include#include#includeusing namespace std;struct node{ __int64 num,pre,next;};int main(){ int n; while(scanf("%d",&n)>0&&n) { stackQ; node tmp; __int64 ans=0,sum=0,num; scanf("%I64d",&tmp.num); tmp.pre=1; tmp.next=1; Q.push(tmp); for(int 阅读全文
摘要:
题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值......例如:63 1 6 4 5 2以4为最小值,向左右延伸,6 4 5 值为60.......思路:解决完为这道题目,我才真正明白了单调栈的原理,它就是以某一个值为最小(最大)值,向这个值的两侧延伸,遇到大于它(小于它)的值,就将它延伸的范围扩大,当然,一般来说,要这样做的算法复杂度为o(n^2),但是借助栈这个玩意,维护其单调增(减),就可以在o(n)的时间复杂度解决这个问题。将一元素加入栈时,先判断它是否大于(小于)栈顶元素,若是大于(小于)栈顶元素,加入栈。(从这里开始只讲维护单调增栈)否则,将 阅读全文
摘要:
本来实在做后缀数组的题目的,不巧,碰到了pku3415这题,需要用到单调栈来维护,但是之前又没有学习过单调栈这方面的知识,于是水了几题.......题意:给你一些连续的小矩形,高宽不定,求最大的矩形面积........思路:直接用单调栈,当有一个矩形的高小于等于栈顶元素的高时,出栈,并维护这个即将入栈的元素的向前延伸的宽度范围,维护出栈后的栈顶元素向后延伸的宽度范围.......#include#include#includeusing namespace std;struct node{ __int64 h,pre,next,w;};int main(){ int n; while(scan 阅读全文