Uva 1442

题目:Uva 1442

思路:处理出每一点能往左和往右延伸的不碰到天花板的最长高度。然后答案就是min(l[i],r[i])-p[i]。

#include<bits/stdc++.h>

using namespace std;

int hu[1000100];
int hd[1000100];
int l[1000100];
int r[1000100];

int main(){
    //freopen("in.txt","r",stdin);
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>hd[i];
        for(int i=0;i<n;i++)
            cin>>hu[i];
        l[0]=hu[0];
        r[n-1]=hu[n-1];
        for(int i=1;i<n;i++){
            if(hd[i]>=l[i-1])
                l[i]=hd[i];
            else
                l[i]=min(l[i-1],hu[i]);
        }

        for(int i=n-2;i>=0;i--){
            if(hd[i]>=r[i+1])
                r[i]=hd[i];
            else
                r[i]=min(r[i+1],hu[i]);
        }

        int ans=0;
        for(int i=0;i<n;i++)
            ans+=(max(0,min(l[i],r[i])-hd[i]));
        cout<<ans<<endl;
    }
    return 0;
}

时间: 2024-11-29 08:09:44

Uva 1442的相关文章

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

题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延伸不会碰到顶的最大高度. 设当前最大高度为level,起始位置为顶高,移动到下一格的时如果碰到顶,那么降低到s[i],如果小于p[i],那么就就提高到p[i]. 两边都扫一遍,然后取最小高度. 试了试输入优化,对于这种大量数据输入效果不错,节省了大约100ms. #include<bits/stdc

uva 1442:Cave(贪心)

题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>

UVA - 1442 Cav

题目大意:一个洞穴的宽度为n(n<=10^6)个片段组成.第i处的地面高度为pi,顶高度为si(0=<pi<si<=1000),要求在洞中存放尽量多的燃料(液体),使得燃料的位置不会碰到顶,但可以无限接近. 解题思路:设每个片段中燃料的高度为l,初始值为是s[0]或s[n-1],如果当前片段的地面高度pi>l,则l=pi,顶高度si<l,则l=si,把每个片段的l存在数组中.从右往左扫一遍,再从左往右扫一遍,最后用片段中较小的l减去pi即该片段的燃料,所有相加,即为所求

UVa 1442 (线性扫描) Cave

对于一个水坑,水平面肯定是相等的.(废话,不然为什么叫水ping面) 因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去. 设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来. 用level标记当前水平面高度,level初始为s[0] 如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来 如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去 否则,他们都在同一个水坑里面,水位高度不变 同理,从右往

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED

uva 401.Palindromes

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=342 题目意思:给出一段字符串(大写字母+数字组成).判断是否为回文串 or 镜像串 or 回文镜像串 or 什么都不是.每个字母的镜像表格如下 Character Reverse Character Reverse Character Reverse A A M M Y Y B