• Kick Start 2018


    1. Candies

    Q:n个糖果、每个糖果的甜度是(S_i(i from 1 to n)),可能为负;求连续子集的糖果总甜度最大,但是总甜度不可超过D,并且子集中的奇数甜度个数不能超过O

    A:

    1. 滑动窗口
    2. 给定n(n<=5e5)个数,求最大区间和使得区间内的奇数个数不超过o且区间和不超过d,对于小数据保证所有的数均为正整数,对于大数据可正可负;对于小数据的情况,由于约束了所有的数均为正数,所以前缀和是单调的,那么,我们维护区间的奇数个数以及前缀和,枚举区间的左端点,对于区间的右端点,进行两次二分判定约束其满足奇数的条件要求以及区间和的条件要求,即可,对于大数据,由于这里的前缀和不再单调,我们考虑维护区间和第k大的数进行二分,看是否有满足题意的第k大区间和,当然,奇数的约束会对区间的位置先行做出约束,这样的话,总的时间复杂度是O(n(logn+(logn)^2))的,大数据在5分钟可以跑完,勉强达到8分钟的要求时限,应该有更好的办法;

    2. Paragliding

    Q:

    有N个塔,水平坐标为 p[i], 高度为 h[i], 每个塔的水平坐标各不相同。 有K个气球,每个气球可看做一个点,坐标为x[i], y[i]。一个人可以爬到每个塔的任意高度位置,然后在该位置可以向左右45度滑行,滑行的轨迹是直线。如果在途中遇到气球,则可获得该气球,如果气球和塔相重叠,也认为可获得气球,要求一共可以获得多少个气球。

    A:解题关键点:

    1. 如果从一个塔( p[j], h[j]  )向下滑行可以获得某个气球(x[i], y[i]), 则满足 abs(x[i] - p[j] ) + y[i] <= h[j]
    2. 如果一个塔 i 和另外一个塔 j 满足 abs(p[i] - p[j]) + h[i] <= h[j], 则第i个塔是多余的,因为任意从第i个塔滑行获得的气球,都可以通过从第j个塔滑行获得。

    解题方法:

    1. 小数据: 将每个气球和所有的塔进行关键点1条件比较,如果满足,则该气球可获得。
    2. 大数据: 对于每个气球,如果我们能找到能它最近的塔,只判断是否能从离它最近的塔上获得就好了。但是存在这样一个问题,如果从离它最近的塔上不能获得,也许存在离它较远位置的塔,从这些塔上获得气球。这样的话,还得依次遍历所有的塔。为了达到最初的想法,考虑关键点2, 如果我们把所有多余的塔去掉,那么就可以只判断是否能从离它最近的塔上获得就可以了。为什么? 假设某个气球坐标为(x, y) , 离它最近的右边的塔为(p1, h1),从该塔不能获得气球,则满足 p1 - x + y > h1, 该式子等于 -p1 + x - y + h1 < 0, 又假设存在离该气球更远的塔(p2, h2 )  p2 >p1, 从该塔上可以获得气球,则满足 p2 - x + y <= h2, 将这个式子和前面的式子相加得到  p2 - p1 + h1 <= h2,正好关键点2中的条件,也就是说离它最近的那个塔是多余的。 所以,我们把所有多余的塔去掉之后,就可以找到离某个气球最近的塔,找的过程可以将所有的塔从小到大排好序,再使用二分搜索进行查找。
  • 相关阅读:
    RabbitMq(四)远程过程调用RPC
    RabbitMq(三)交换机类型
    RabbitMq(二)工作队列
    java基础知识01--JAVA准备
    匿名子类
    网络之Socket详解
    网络之Socket、TCP/IP、Http关系分析
    Eclipse搭建springboot项目(九)常用Starter和整合模板引擎thymeleaf
    Vue学习——Router传参问题
    sql函数——find_in_set()
  • 原文地址:https://www.cnblogs.com/xym4869/p/13237020.html
Copyright © 2020-2023  润新知