Day8 栈的使用--计算面积 接雨水

Posted 未来可期-2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day8 栈的使用--计算面积 接雨水相关的知识,希望对你有一定的参考价值。

题目 → \\rightarrow 计算面积

输入为 “\\///_//\\\\//\\///__\\_\\//_/”
输出总的积水面积和各积水处面积

思路

首先计算总面积

  • 如果是\\,将坐标 i i i压入栈S1
  • 如果是/,取出S1中最近配对的/,算出两者距离 i − i p i-i_p iip并累加到总面积中
  • 如果是_,不做处理

然后计算各个积水处面积
另建栈S2保存各积水处面积,栈S2中每个数据为最左边/的坐标和其对应的积水面积,如果新计算\\对应的坐标小于S2栈顶的坐标,那么说明计算的\\可以和S2中积水合并。

//计算面积
#include<bits/stdc++.h>
using namespace std;
int main()
	//记录最左边\\
	
	stack<int> S1;
	//记录\\及其对应的面积 
	stack<pair<int,int> >S2;
	string s3;
	cin>>s3;
	char ch;
	//总面积 
	int sum=0;
	for(int i=0;i<s3.size();++i) 
		ch=s3[i];
		if(ch=='\\\\')
			S1.push(i);
		else if(ch=='/'&&!S1.empty())
			int j=S1.top();
			S1.pop();
			//配对的一对\\/面积为i-j 
			sum+=i-j;
			//合并洼地 
			int a=i-j;
			//如果S2中\\坐标小于新的\\,那么合并两个洼地 
			while(!S2.empty()&&S2.top().first>j) 
				a+=S2.top().second;
				S2.pop();
			
			S2.push(make_pair(j,a));
		
		//ch为-时什么也不做 
	
	cout<<sum<<endl;
	cout<<S2.size();
	vector<int>ans;
	while(!S2.empty())
		ans.push_back(S2.top().second);
		S2.pop();
	
	for(int i=ans.size()-1;i>=0;--i)
		cout<<" "<<ans[i];
	
	cout<<endl;
	return 0;

题目 → \\rightarrow 接雨水

和上一题类似

  • 设栈S存储pair<int,int> 高度和坐标
  • 如果当前高度小于栈顶S高度,那么计算面积,入栈
  • 如果当前高度大于等于栈顶S高度,依次出栈,计算面积,直到栈空或者有一个大于当前高度,最后入栈。需要注意在该过程中计算面积比较复杂。
class Solution 
public:
    int trap(vector<int>& height) 
    	int sum=0;
    	//高度和坐标 
    	stack<pair<int,int> >S;
    	for(int i=0;i<height.size();++i)
    		if(height[i]!=0)
    			if(S.empty())
    				S.push(make_pair(height[i],i));
				else
					if(height[i]>=S.top().first)
						sum+=(i-S.top().second-1)*S.top().first;
						pair<int,int> last=S.top();
						S.pop();
						while(!S.empty()&&height[i]>=S.top().first)
							sum+=(i-S.top().second-1)*(S.top().first-last.first);
							last=S.top();
							S.pop();
						
						if(!S.empty())
			                sum+=(i-S.top().second-1)*(height[i]-last.first);
						
					else
						sum+=(i-S.top().second-1)*height[i];
					
					S.push(make_pair(height[i],i));
				
			
			
		
    	return sum;
    
;

以上是关于Day8 栈的使用--计算面积 接雨水的主要内容,如果未能解决你的问题,请参考以下文章

积水面积

洛谷 P1318 积水面积

364. 接雨水 II

洛谷 P1318 积水面积

怎么划分不同下垫面的汇水面积

洛谷 P1318 积水面积题解