刷题系列2

刷题系列2

 题目大意计算方块与方块之间的积水面积。

拿到题目很多人都会想到从左到右挨个判断,虽然与能做,但这样不仅时间复杂度高,而且中间的情况也不好处理。

刷题系列2

我们简单分析一下题目给的例子:我们可以转换一下思维,不从左到右分析,而从上到下分析,

第一层:我们找到左右第一次有方块的地方,假设全是方块总数为8,而第二层真实方块数为5,则水的个数为8-5=3;

第二层同理全方块为6,真方块为3,则水的个数6-3=3。

最后把所有层的水的个数加起来就是答案。

输入:

#include<iostream>
#include<algorithm>
using namespace std;
int a[10001],maxx=-1;//a是输入,maxx是最大高度
int main()
{
	int n,ans=0,s=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		maxx=max(maxx,a[i]);//计算出最高的,即可得出一共有几层
		s+=a[i];   //计算总真实方块数;
	}

逐层分析:

for(int i=1;i<=maxx;i++)
	{
		int head=1,tail=n;
		while(a[head]<i) //从头找第一个方块出现的地方
		head+=1;
		while(a[tail]<i) /。从尾找第一个方块出现的地方
		tail-=1;         
		ans+=tail-head+1;  //每行的总方块数(包括水)
	}

完整代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[10001],maxx=-1;//a是输入,maxx是最大高度
int main()
{
	int n,ans=0,s=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		maxx=max(maxx,a[i]);//计算出最高的,即可得出一共有几层
		s+=a[i];   //计算总真实方块数;
	}
    for(int i=1;i<=maxx;i++)
	{
		int head=1,tail=n;
		while(a[head]<i) //从头找第一个方块出现的地方
		head+=1;
		while(a[tail]<i) /。从尾找第一个方块出现的地方
		tail-=1;         
		ans+=tail-head+1;  //每行的总方块数(包括水)
	}
     cout<<ans-s;
     return 0;

}

收尾。

上一篇:17蓝桥C语言B组 3.承压计算


下一篇:洛谷2911