積木積水(廣東工業大學校賽決賽2016E題)

題目:

Problem E: 積木積水


Description
現有一堆邊長爲1的已經放置好的積木,小明(對的,你沒看錯,的確是陪伴我們成長的那個小明)想知道當下雨天來時會有多少積水。小明又是如此地喜歡二次元,於是他把這個三維的現實問題簡化成二維的問題。設雨量無窮、積木不透水、積木間無縫連接,問在這個二次元的世界裏,已放置好的積木會有多少單位的積水量?

這裏寫圖片描述


Input
第一行包含一個整數T(T≤100),表示接下來的測試樣例個數。 每個測試樣例有兩行組成: 第一行包含一個整數N(N≤1e6),表示積木的列數; 第二行包含N個整數Ai(Ai≤1e6),表示第i列積木的個數。


Output
每個樣例輸出一行,包含一個整數,爲題目所求。


Sample Input

1
11
6 2 2 4 2 0 3 4 4 5 1

Sample Output

19

題目大意:

積木積水,不減不增

分析思路:

主要是維護左邊到最高的不減性,最高到右邊的不增性
只需要找到積木中最大的那個,在分別從兩邊向其接近,一遇到比當前高度要低的就要加上差值,最後sum累加可得答案

注意:

最好用scanf,不要用cin
因爲scanf要快一些
這裏寫圖片描述
這裏寫圖片描述
將近快了1000ms

代碼:

#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define maxn 1000001
int a[maxn];
int main()
{
    int cas;
    scanf("%d", &cas);
    while (cas--)
    {
        int n;
        scanf("%d",&n);
        int maxx = 0,id=0;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            if (a[i] >= maxx)
            {
                maxx = a[i];
                id = i;
            }
        }
        int latest = a[0];
        long long sum = 0;
        for (int i = 1; i < id; i++)
        {
            if (latest>a[i])
                sum += latest - a[i];
            else
                latest = a[i];
        }
        latest = a[n - 1];
        for (int i = n - 2; i > id; i--)
        {
            if (latest > a[i])
                sum += latest - a[i];
            else
                latest = a[i];
        }
        cout << sum << endl;    
    }
}

比賽的時候要調整心態不要慌,其實這道題並不難,我當時也想出了不減不增的性質,可以一直想不出怎麼實現,要多練練題

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