先上题目链接:https://www.luogu.org/problemnew/show/P1318
讲讲思路:
从双向记录两边到当前位置的最大的高度
设两个数组l[i],r[i],分别记录从前往后和从后往前到i位置的最大高度
然后在每个位置加上其能够装的水的量,见公式 sum+=min(l[i],r[i])-hi[i]
当前位置水能装的最大高度减去下面砖的高度即为当前位置能装的水。
上AC代码:
#include <bits/stdc++.h>
const int maxn=1e4+7;
using namespace std;
int n,hi[maxn],l[maxn],r[maxn],sum=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&hi[i]);
l[i]=max(l[i-1],hi[i]);
}
for(int i=n;i>0;i--)
r[i]=max(r[i+1],hi[i]);
for(int i=1;i<=n;i++){
sum+=(min(l[i],r[i])-hi[i]);
}
printf("%d",sum);
return 0;
}
只不过这种低级题目我还做了这么久,我真是太菜了。