Sicily - Water 【寻找规律】

Description

移动信息工程学院即将要离开中珠了, KY在珠海认识了很多女孩,自然很舍不得中珠。于是,他想为这些女孩留下一些礼物,最近中珠阴雨绵绵,五行缺水的他于是想到留下最珍贵的中珠雨水作为纪念。现在他想尽可能地收集到多一点的中珠雨水,假设中珠的地形抽象为一张二维的海拔图,区域的个数为n,每一个区域的地形宽度为1,高度用一个H表示,那么你能帮KY计算一下他最多能在这样的地形内接到多少(面积)中珠雨水吗?

如下图的海拔图中,每个区域的高度分别为[0,1,0,2,1,0,1,3,2,1,2,1],那么他最多可以接到6个单位面积的中珠雨水。

Input

输入包含多组测试样例。

每组测试样例包含两行,第一行为一个整数N (1<=N<=10^6),代表地形区域的个数,第二行有N个整数,代表每个区域的高度H ( 1 <= H <= 100 ),用空格隔开。

N为0时输入结束。

Output

每组数据输出一个整数,表示KY最多能接到的中珠雨水(面积)。

Sample Input

12
0 1 0 2 1 0 1 3 2 1 2 1
0

Sample Output

6

分析:

  1) 刚开始先初始化盛水区间的左边界cur=0,然后ans=0,sum=0,之后开始遍历1 ~ n-1
  2)当遍历到a[i]时,如果a[i]<a[cur],sum += a[i]

  3) 当遍历到a[i]时,如果a[i]≥a[cur]:

    2.1)若cur-i-1=0,这说明cur不可能是盛水区间的左边界,i才是,于是将盛水区间的左边界设置为i。

    2.2)若cur-i-1>0,说明已经遍历完了一个盛水区间(经历了总体为先降后升的变化),到这里就可以加上该盛水区间的积水了:ans += (cur-i-1)*a[cur] - sum,而且将sum=0,将左边界更新为i,即:cur=i

  这样做还有一个问题,就是可能a[cur]是全局最大值,它的右边没有比他还大的了,那么解决办法也很自然:

  从右到左再扫描一遍就好了,扫描区间为[cur, n-1]

#include <cstdio>
#include <iostream>

using namespace std;

int a[1000005];

int main ()
{
    int n;
    while(scanf("%d", &n) != EOF && n) {
        for(int i=0; i<n; i++) {
            scanf("%d", &a[i]);
        }

        int cur = 0, sum=0, ans=0;
        for(int i=cur+1; i<n; i++) {
            if(a[i] >= a[cur]) {
                if(i-cur-1) {
                    ans += (i-cur-1)*a[cur]-sum;
                }
                cur = i;
                sum = 0;
            } else {
                sum += a[i];
            }
        }
        int lb = cur;
        cur = n-1, sum=0;
        for(int i=cur-1; i>=lb; i--) {
            if(a[i] >= a[cur]) {
                if(cur-i-1) {
                    ans += (cur-i-1)*a[cur]-sum;
                }
                cur = i;
                sum = 0;
            } else {
                sum += a[i];
            }
        }
        printf("%d\n", ans);
    }

    return 0;
}
时间: 2024-10-13 09:38:14

Sicily - Water 【寻找规律】的相关文章

uva12716 GCD XOR(打表找规律+筛法)

题意:输入整数(1=<n<=30000000),有多少对整数(a,b)满足:1=<b=<a=<n,且gcd(a,b)=a^b.例如n=7时,有4对:(3,2),(5,4),(6,4),(7,6) 解题思路: 看到题目之后一直在找最大公约数和异或之间的关系,但找了半天没有发现.于是果断打表发现如下规律 满足gcd(a,b)=a^b的数有如下规律,要么就是a=b-1,要么就是有前面已求得的满足条件的乘上一定的倍数得到如下: 根据上述规律,我们便可以求的所有的可能性,上面只打印了一

分圆问题:一个诡异的数列规律

问题 在圆上任取$n$个点,将每对点用直线连接起来,并规定任意三条线不能交于同一点,这些直线会将圆分割成多少份? 首先我们列出简单情况来寻找规律: 2个点将圆分成2份 3个点将圆分成4份 4个点将圆分成8份 5个点将圆分成16份 看来这个数列的规律非常明显:每增加一个点,分割的份数都将乘2.然而,当点数增加到6个的时候,分割的份数不是我们预料的32,而是31. 为了找到这个数列的通项公式,我们使用欧拉示性数公式(Euler’s Characteristic Formula)来进行推导: $$V-

UVA10940 Throwing cards away II【数学规律+约瑟夫环】

Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at the bottom. The following operation is performed as long as there are at least two cards in the deck: Throw away the top card and move the card that is now on th

【LeetCode】下一个排列【找规律】

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/next-permutation 分析: 方法1:直接调

【转】分圆问题:一个诡异的数列规律

问题 在圆上任取nn个点,将每对点用直线连接起来,并规定任意三条线不能交于同一点,这些直线会将圆分割成多少份? 首先我们列出简单情况来寻找规律: 2个点将圆分成2份 3个点将圆分成4份 4个点将圆分成8份 5个点将圆分成16份 看来这个数列的规律非常明显:每增加一个点,分割的份数都将乘2.然而,当点数增加到6个的时候,分割的份数不是我们预料的32,而是31. 为了找到这个数列的通项公式,我们使用欧拉示性数公式(Euler’s Characteristic Formula)来进行推导: V−E+F

SQL基础用法(实例二)

1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的高级操作 7 (1) 批处理 8 (2) 变量 9 (3) 逻辑控制 10 (4) 视图 11 (5) 函数 12 (6) 高级查询 13 14 */ 15 16 (1)批处理 17 将多条SQL语句作为一个整体去编译,生成一个执行计划,然后,执行! 18 理解批处理的关键在于"编译",对于由多条语句组成的一个批处理, 19 如果在编译时,其中,有一条出现语法错误,将会导致编译失败! 20 21 cre

主成分分析PCA详解

转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识发现>和季海波老师的<矩阵代数>两门课之后,颇有体会.最近在做主成分分析和奇异值分解方面的项目,所以记录一下心得体会. 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律.多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上增加

2016年第8本:不可思议的心理控制实验

这本书是在郑州机场买的,当时飞往杭州的班机晚点6个小时,在机场里乱转时发现了这本书.这本书让我明白了原来经过学习和练习,也可以成为算命先生,而在国外有个更好听的名字,叫“通灵师”. 作者是心理学大师理查德·怀斯曼,还写过<正能量>.<怪诞心理学>两本书. 宠物和主人之间有心灵感应吗?完全只是一个概率事件,只是主要对于宠物正确预测主人回家的事情特别注意,而完全忽视了预测错误的情形. 第一章 成为你自己的预言家 兰迪悬赏100万美元去发现超自然能力,可惜发现通灵师的表现纯属碰运气,他们

vijosP1543 极值问题

链接:https://vijos.org/p/1543 [题解](网上) 从简单情况人手:     设定m=1,将m代人方程②有(n2-n-1)2=1,可求出n=1:          m=2,代人②,有(n2-2n-4)2=1,可求出n=3:          m=3,代人②,有(n2-3n-9)2=1,可求出n=5:          m=4,代人②,有(n2-4n-16)2=1,可知无整数解:          m=5,代人②,有(n2-5n-25)2=1,可求出n=8:     将满足条