題目:
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;
}
}
比賽的時候要調整心態不要慌,其實這道題並不難,我當時也想出了不減不增的性質,可以一直想不出怎麼實現,要多練練題