UVa 1442 (线性扫描) Cave】的更多相关文章

对于一个水坑,水平面肯定是相等的.(废话,不然为什么叫水ping面) 因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去. 设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来. 用level标记当前水平面高度,level初始为s[0] 如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来 如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去 否则,他们都在同一个水坑里面,水位高度不变 同理,从右往…
2015区域赛北京赛区的三水,当时在赛场上没做出的原因是复杂度分析不正确导致把方法想复杂了.近来复习复杂度分析,觉得不能只是笼统地看渐进复杂度(big-O),更应根据算法的伪码计算真正的以基本操作数为变量的时间复杂度T(n). 题意:在二维坐标系第一象限中,将一块顶点在原点边长为R的正方形土地用直线x=n一分为二,左侧分给Wei,右侧分给Huo. 土地中包含N个绿洲,每个绿洲是一个矩形,其位置和大小用四元组(L,T,W,H)表示,其中(L,T)为其左上方顶点的坐标,W,H为其宽度和高度.绿洲互不…
拿到了icpc北京站的参赛名额 感谢亮哥~ 虽然是地狱之战 但也要全力以赴! 题意: 有一片沙漠 n片绿洲 让你用一条线分成两部分 左≥右 而且分割线要尽量靠右 问线的位置 思路: 网上说可以二分 没太看懂…… 还有一种思路就是线性扫描 将二维的图化成一维的线 然后从头扫一遍 遇到左≥sum/2时试探着向右继续扫 最后输出答案 不知道为啥hihocoder能过uvalive死活就是过不去…… #include<stdio.h> #include<iostream> #include…
每块多米诺骨牌所在的位置设为x,每块多米诺骨牌高度为h.如果将x位置上的多米诺骨牌向右翻到,它就可以影响[x+1, x+h-1]范围内的所有多米诺骨牌,让他们也翻到,同时这些被翻到的多米诺骨牌还能影响到其他多米诺骨牌,现在BSNY给出n块多米诺骨牌的位置和高度,问如果向右翻到第i块多米诺骨牌,会有多少多米诺骨牌翻到. 按左端点排序,然后线性扫描.其实二分也可以,但答案有部分的重叠,即单调性. ..]of longint; n,i,k,last:longint; procedure swap(va…
题意: 给出一个长度为n的字符串,只有字符'a'和'b'.最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'. 问改变后的最长连续相同字符的字串长度为多少. 首先是二分查找,好想也好写 ..]of longint; ch:ansistring; n,k,i,l,r,mid,last,ans:longint; function max(x,y:longint):longint; begin if x>y then exit(x); exit(y); end; begin //assign…
题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延伸不会碰到顶的最大高度. 设当前最大高度为level,起始位置为顶高,移动到下一格的时如果碰到顶,那么降低到s[i],如果小于p[i],那么就就提高到p[i]. 两边都扫一遍,然后取最小高度. 试了试输入优化,对于这种大量数据输入效果不错,节省了大约100ms. #include<bits/stdc…
链接: 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),要求在这个洞穴里储存尽量多的燃料,使得在任何位置燃料都不会碰到顶(但是可以无限接近). 分析: 扫描法.为了方便起见,下面用“水”来代替…
题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>…
从左往右扫描一遍, 得从每个位置往右伸长不会碰到天花板的高度, 右往左一样, 取最小, 然后就是可以放"水"的高度了 #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 1123456; int p[MAXN], s[MAXN], h[MAXN], n; i…
这道题判断回文串的方法非常的秀! 这里用到了记忆化搜索,因为会有很多重复 同时用kase来区分每一组数据 然后还有用递归来判断回文,很简洁 然后这种线性结构的动态规划的题,就是把 当前的这个数组分成两块来枚举,一块是之前已经得出的最优解, 一块是自己现在按照题目要求来算出的值,这样枚举下去. 然后要注意初始化的问题,同时注意这有后面自己算的这一块占 了全部的情况,可以以此为初始的值. 一定要给初始的值,不然答案可能全是0 #include<cstdio> #include<algorit…