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即该片段的燃料,所有相加,即为所求。

#include <cstdio>
#include <algorithm>
using namespace std;
int n, p[1000010], s[1000010], h[1000010];

int main() {
	int Z;
	scanf("%d", &Z);
	while (Z--) {
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
			scanf("%d", &p[i]);
		for (int i = 0; i < n; i++)
			scanf("%d", &s[i]);

		int level = s[0];
		for (int i = 0; i < n; i++) {
			if (level > s[i]) level = s[i];
			if (level < p[i]) level = p[i];
			h[i] = level;
		}

		level = s[n-1];
		int ans = 0;
		for (int i = n - 1; i >= 0; i--) {
			if (level > s[i]) level = s[i];
			if (level < p[i]) level = p[i];
			ans += min(level, h[i]) - p[i];
		}
		printf("%d\n", ans);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-14 09:54:31

UVA - 1442 Cav的相关文章

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;

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 (线性扫描) 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