您的位置:首页 > 其它

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]去

否则,他们都在同一个水坑里面,水位高度不变

同理,从右往左扫能计算出一个向右延伸不会碰到天花板的水面最大高度。二者取最小值就是最终水面的高度。

#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;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: