洛谷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

思路:挺水的一道题,但是第一遍写还是错了,我以为是今年noip T1,然而想错了,没认真读题,这个题其实就是看看一个位置的左右高度有不有差值,有的话就加上这个差值。

代码:

#include<iostream>
#include<cstdio>
#define maxn 10001
using namespace std;
int n,l[maxn],r[maxn],a[maxn],ans;
int main() {
  scanf("%d",&n);
  for(int i=1;i<=n;++i) {
  	scanf("%d",&a[i]);
	l[i]=max(l[i-1],a[i]); 
  } 
  for(int i=n;i>=1;--i) r[i]=max(r[i+1],a[i]);
  for(int i=1;i<=n;++i) 
  if(min(l[i],r[i])-a[i]>0) ans+=min(l[i],r[i])-a[i]; 
  printf("%d
",ans);
  return 0;
}
原文地址:https://www.cnblogs.com/grcyh/p/10134353.html