UVa 1442 (线性扫描) Cave
2015-04-19 16:36
211 查看
对于一个水坑,水平面肯定是相等的。(废话,不然为什么叫水ping面)
因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去。
设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来。
用level标记当前水平面高度,level初始为s[0]
如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来
如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去
否则,他们都在同一个水坑里面,水位高度不变
同理,从右往左扫能计算出一个向右延伸不会碰到天花板的水面最大高度。二者取最小值就是最终水面的高度。
代码君
因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去。
设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来。
用level标记当前水平面高度,level初始为s[0]
如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来
如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去
否则,他们都在同一个水坑里面,水位高度不变
同理,从右往左扫能计算出一个向右延伸不会碰到天花板的水面最大高度。二者取最小值就是最终水面的高度。
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 1000000 + 10; int p[maxn], s[maxn], h[maxn]; int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--) { int n; 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]; int ans = 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]; 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; }
代码君
相关文章推荐
- 【高效算法设计——双向扫描】 UVa 1442 Cave
- UVA 1442 Cave 洞穴 (贪心+扫描)
- UVA1442_Cave
- uva1442 cave
- uva1398 线性扫描
- Uva 1442 扫描法
- Seoul 2007 / UVa 1398 Meteor (排序&线性扫描)
- uva 1442 Cav(左右各扫描一次)
- UVA1442 Cave
- UVA 1442(p249)----Cave
- uva 1442:Cave(贪心)
- UVA 1432 - Fire-Control System(技巧枚举+线性扫描)
- 例题8-18 洞穴(Cave, ACM/ICPC CERC 2009, UVa1442)
- uva1442
- UVaLive 3905 Meteor (扫描线)
- UVA 1398 - Meteor(排序+扫描方法+几何)
- 【hihocoder1249 2015北京赛区A】【打标记线性扫描法】 Xiongnu's Land 土地划分使得左边比右边大且尽可能接近
- UVA 1325 - Hypertransmission(扫描方法)
- UVALive - 6864 Strange Antennas 扫描线
- uva 1017 - Merrily, We Roll Along!(几何线性轮廓)