积木积水(广东工业大学校赛决赛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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章