題目描述
一組正整數,分別表示由正方體迭起的柱子的高度。若某高度值爲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
這道題主要是有一個坑點,它的地勢可能是中間特別高,兩邊特別矮,這樣子我們直接用貪心是錯的,我們需要處理一個細節:
我們找到最高的那個柱子,然後以這個柱子爲中心,向左右兩邊擴展,也就是普通的貪心了
完整代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define II int
#define I 123456
#define R register
using namespace std;
II be,en,n,now,ans;
II h[I];
struct node {
II h,wei;
}aa[I];
bool maP(node a1,node a2)
{
return a1.h>a2.h;
}
int main()
{
scanf("%d",&n);
for(R II i=1;i<=n;i++)
{
scanf("%d",&aa[i].h);
h[i]=aa[i].h;
aa[i].wei=i;
}
sort(aa+1,aa+n+1,maP);
//找最高的柱子;
be=1;
en=n;
while (be<=en) {
if(h[be]>h[be+1]) break ;
be++;
}
while (en>=be) {
if(h[en]>h[en-1]) break ;
en--;
}
now=h[be];
for(R II i=be;i<=aa[1].wei;i++)
{
if(h[i]>h[be]) be=i,now=h[be];
ans+=now-h[i];
}
be=en;
now=h[en];
for(R II i=en;i>=aa[1].wei;i--)
{
if(h[i]>h[be]) be=i,now=h[be];
ans+=now-h[i];
}
cout<<ans<<"\n";
return 0;
}
by aTm;
歡迎指錯^_^;
END;