洛谷 P1318 积水面积
链接
https://www.luogu.org/problem/P1318
题目
题目描述
一组正整数,分别表示由正方体叠起的柱子的高度。若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000)。找出所有可能积水的地方(图中蓝色部分),统计它们可能积水的面积总和(计算的是图中的横截面积。一个立方体的位置,为一个单位面积)。
如图:柱子高度变化为 0 1 0 2 1 2 0 0 2 0
图中蓝色部分为积水面积,共有6个单位面积积水。
输入格式
两行,第一行n,表示有n个数(3<=n<=10000)。第2行连续n个数表示依次由正方体迭起的高度,保证首尾为0。
输出格式
一个数,可能积水的面积。
输入输出样例
输入 #1
10
0 1 0 2 1 2 0 0 2 0
输出 #1
6
思路
我的思路是左右向中间,从下往上。
首先输入,找到最大值,之后从1开始循环,这个j是高度的意思,left和right就是左右达到这个高度的最前一个,之后添加数字,直接判断大小就行,到最后一个结束,输出结果。
(最近心态不好,人很迷茫,估计骚话环节也没了,以上)
代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int maxn,ans;
int num[12580];
int n,left,right;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
maxn=max(maxn,num[i]);
}
for(int j=1;j<=maxn;j++)
{
for(int i=2;i<=n-1;i++)
{
if(num[i]>=j)
{
left=i;
i=n;
}
}
for(int i=n-1;i>=2;i--)
{
if(num[i]>=j)
{
right=i;
i=1;
}
}
for(int i=left;i<right;i++)
{
if(num[i]<j)
ans++;
}
}
cout<<ans;
}