题目大意计算方块与方块之间的积水面积。
拿到题目很多人都会想到从左到右挨个判断,虽然与能做,但这样不仅时间复杂度高,而且中间的情况也不好处理。
我们简单分析一下题目给的例子:我们可以转换一下思维,不从左到右分析,而从上到下分析,
第一层:我们找到左右第一次有方块的地方,假设全是方块总数为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;
}
收尾。