• UVa 1442 (线性扫描) Cave


    对于一个水坑,水平面肯定是相等的。(废话,不然为什么叫水ping面)

    因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去。

    设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来。

    用level标记当前水平面高度,level初始为s[0]

    • 如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来
    • 如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去
    • 否则,他们都在同一个水坑里面,水位高度不变

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

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 1000000 + 10;
     6 int p[maxn], s[maxn], h[maxn];
     7 
     8 int main()
     9 {
    10     //freopen("in.txt", "r", stdin);
    11 
    12     int T; scanf("%d", &T);
    13     while(T--)
    14     {
    15         int n; scanf("%d", &n);
    16         for(int i = 0; i < n; i++) scanf("%d", &p[i]);
    17         for(int i = 0; i < n; i++) scanf("%d", &s[i]);
    18         int level = s[0];
    19         int ans = 0;
    20         for(int i = 0; i < n; i++)
    21         {
    22             if(level > s[i]) level = s[i];
    23             if(level < p[i]) level = p[i];
    24             h[i] = level;
    25         }
    26 
    27         level = s[n-1];
    28         for(int i = n-1; i >= 0; i--)
    29         {
    30             if(level > s[i]) level = s[i];
    31             if(level < p[i]) level = p[i];
    32             ans += min(level, h[i]) - p[i];
    33         }
    34 
    35         printf("%d
    ", ans);
    36     }
    37 
    38     return 0;
    39 }
    代码君
  • 相关阅读:
    编程语言的精髓
    进销存-库存表-算法
    JAVA 将JSON数组转化成JAVA数组
    使input文本框不可编辑的3种方法
    如何让一个DIV固定在另一个DIV的底部
    错误笔记既 onclick()事件写方法传jstl表达式作为变量
    错误笔记
    SQL查询语句左连接
    查已有表的建表语句
    使用(文件上传域)MultipartFile接受文件时的判空方式
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4439390.html
Copyright © 2020-2023  润新知