luogu 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


這道題主要是有一個坑點,它的地勢可能是中間特別高,兩邊特別矮,這樣子我們直接用貪心是錯的,我們需要處理一個細節:

我們找到最高的那個柱子,然後以這個柱子爲中心,向左右兩邊擴展,也就是普通的貪心了

完整代碼:

#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;

發佈了33 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章