链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4188

题意:

一个洞穴的宽度由n(n≤1e6)个片段组成。已知位置[i,i+1]处的地面高度pi和顶的高度si(0≤pi<si≤1000),
要求在这个洞穴里储存尽量多的燃料,使得在任何位置燃料都不会碰到顶(但是可以无限接近)。

分析:

扫描法。
为了方便起见,下面用“水”来代替题目中的燃料。根据物理定律,每一段有水的连续区间,
水位高度必须相等,且水位必须小于等于区间内的最低天花板高度,因此位置[i,i+1]处的水位满足h≤si,
且从(i,h)出发往左右延伸出的两条射线均不会碰到天花板(即两条射线将一直延伸到
洞穴之外或先碰到地板之间的“墙壁”)。如果这样的h不存在,则规定h=pi(也就是“没水”)。

这样,可以先求出“往左延伸不会碰到天花板”的最大值h1(i),再求“往右延伸不会碰到
天花板”的最大值h2(i),则hi=min{h1(i), h2(i)}。根据对称性,下面只考虑h1(i)的计算:

从左到右扫描。初始时设水位level=s0,然后依次判断各个位置[i,i+1]处的高度。
如果p[i] > level,说明水被“隔断”了,需要把level提升到pi。
如果s[i] < level,说明水位太高,碰到了天花板,需要把level下降到si。
位置[i,i+1]处的水位就是扫描到位置i时的level。
不难发现,两次扫描的时间复杂度均为O(n),总时间复杂度为O(n)。

代码:

 #include <cstdio>
#include <algorithm>
using namespace std; const int UP = 1e6 + ;
int p[UP], s[UP], h[UP]; int main(){
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &p[i]);
for(int i = ; i < n; i++) scanf("%d", &s[i]); int ans = , level = s[];
for(int i = ; i < n; i++){
if(p[i] > level) level = p[i];
else if(s[i] < level) level = s[i];
h[i] = level;
} level = s[n-];
for(int i = n - ; i >= ; i--){
if(p[i] > level) level = p[i];
else if(s[i] < level) level = s[i];
ans += min(level, h[i]) - p[i];
}
printf("%d\n", ans);
}
return ;
}

UVa 1442 - Cave的更多相关文章

  1. uva 1442:Cave(贪心)

    题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可 ...

  2. UVA 1442 Cave 洞穴 (贪心+扫描)

    题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...

  3. UVa 1442 (线性扫描) Cave

    对于一个水坑,水平面肯定是相等的.(废话,不然为什么叫水ping面) 因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去. 设h(i)表示向左延伸不会碰到天花板的最高水平面, ...

  4. 紫书 例题8-18 UVa 1442 (扫描法)

    从左往右扫描一遍, 得从每个位置往右伸长不会碰到天花板的高度, 右往左一样, 取最小, 然后就是可以放"水"的高度了 #include<cstdio> #include ...

  5. 【uva 1442】Cav(算法效率)

    题意:有一个由N个片段构成宽度的洞穴,已知洞顶 si 和洞底 pi 的高度,要求储存尽量多的燃料. 解法:O(n),分别从1到N和从N到1扫一遍,调整每个片段合法的最大高度,求出答案. 1 #incl ...

  6. UVA Live Archive 4015 Cave (树形dp,分组背包)

    和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...

  7. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  8. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  9. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

随机推荐

  1. mysql 8 root密码重置

    亲测有效. https://blog.csdn.net/gupao123456/article/details/80766154

  2. grunt-contrib-cssmin使用指南

    原文:http://riny.net/2014/grunt-cssmin/ grunt-contrib-cssmin v0.7.0 使用cssmin压缩css文件 Getting Started 这个 ...

  3. Java并发编程之volatile关键字解析

    一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在 ...

  4. Query performance optimization of Vertica

    Don't fetch any data that you don't need,or don't fetch any columns that you don't need. Because ret ...

  5. Expression Blend实例中文教程(6) - 项目控件和用户交互控件快速入门

    前文我们曾经描述过,微软把Silverlight控件大致分为三类: 第一类: Layout Controls(布局控件) 第二类: Item Controls (项目控件) 第三类: User Int ...

  6. C# wx获取token基本方法

    #region 请求Url,不发送数据 /// <summary> /// 请求Url,不发送数据 /// </summary> public static string Re ...

  7. Angular4 step by step.1

    1.官网地址 :https://angular.cn/guide/quickstart 2.在线学习地址:https://embed.plnkr.co/?show=preview 3.效果截图哇哈哈

  8. Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新

    目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...

  9. Java并发编程:volatile关键字解析(学习总结-海子)

    博文地址:Java并发编程:volatile关键字解析

  10. PHP支持多线程吗?

    https://zhidao.baidu.com/question/2053529640037778107.html