【任务分配】【拦截罪犯】【召唤神龙】

1. 任务分配(二分:右半部分第一个满足的元素)

在这里插入图片描述

当ddl天数减少时,难以满足,当ddl天数增大时,之后都能满足,很明显满足二分性质。我们只需要二分找到第一个可以满足人员分配的ddl日期即可。
给定一个ddl日期,我们可以求出这个日期下,至少需要多少人,如果需要的人数超出目前的人数,说明无法满足。

def check(p):
    global t
    global k
    cur = 1
    # p天ddl的情况下,需要分配的cur人
    b = [0] * (k+1)
    for i in range(1,t+1):
        # 这个人已经不能再接这个任务
        if b[cur] + a[i] > p:
            cur += 1
            if cur > k:
                return False
            while b[cur] + a[i] > p:
                cur += 1
            b[cur] += a[i]
        else:
            b[cur] += a[i]
    return True

def printf(p):
    c = [[0,0] for i in range(k+1)]
    b = [0] * (k+1)
    cur = k
    c[cur][1] = t
    for i in range(t, 0, -1):
        if b[cur] + a[i] > p:
            c[cur][0] = i+1
            cur -= 1
            c[cur][1] = i
            while b[cur] + a[i] > p:
                cur += 1
            b[cur] += a[i]
        else:
            b[cur] += a[i]
    c[cur][0] = 1
    for i in c[1:]:
        print(i[0], i[1])
    


if __name__ == '__main__':
    t, k = map(int, input().split())
    a = [0]+list(map(int, input().split()))
    l,r= max(a), sum(a)

    while l < r:
        mid = l + r >> 1
        if check(mid):
            r = mid
        else:
            l = mid + 1
    
    printf(l)

2. 拦截罪犯(二分:右半部分第一个满足的元素)

在这里插入图片描述
通过二分枚举1~L的间距,得到每一个间距需要新增的警察数,找到第一个能满足cnt==k的间距。
此时的check条件是右半部分满足的条件,n越大越容易满足条件,我们要找到的是第一个满足的条件的位置。

def check(p):
    cnt = 0
    for i in range(1,n):
        dis = a[i] - a[i-1]
        a1, a2 = dis // p, dis %p
        if a1:
            if a2:
                cnt += a1
            else:
                cnt += a1-1
    if cnt > k:
        return False
    else:
        return True

if __name__ == '__main__':
    L,n,k = map(int,input().split())
    a = list(map(int, input().split()))
    a.sort()
    l,r = 1, L
    while l < r:
        mid = l+r >> 1
        if check(mid):
            r = mid
        else:
            l = mid + 1
    print(l)

3. 召唤神龙(二分:左半部分第一个满足的元素)

在这里插入图片描述

一道类似的题,但是此时check条件是左半部分满足的条件,因此我们使用二分法中寻找左半部分最后一个元素的模板。

def check(n):
    # 假设此时组成n套牌
    cnt = 0
    for i in c:
        if i >= n:
            continue
        cnt += n-i
    # 需要补充的卡超出
    if cnt > m or cnt > n:
        return False
    else:
        return True


if __name__ == '__main__':
    n,m = map(int, input().split())
    c = list(map(int, input().split()))

    max_num, min_num = max(c), min(c)

    # 最多到那么多套
    l, r = 0, max_num + m // n
    while l < r:
        mid = l+r+1 >> 1
        if check(mid):
            l = mid
        else:
            r = mid-1
    print(l)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 拦截器和过滤器都是Java Web开发中常用的组件,它们的作用是在请求到达目标资源之前或之后对请求进行拦截和处理。 拦截器是Spring框架中的概念,通过实现HandlerInterceptor接口来实现。它可以拦截Controller的请求处理过程,包括请求到达Controller之前、请求处理完成之后等多个阶段,并且可以对请求进行一些预处理和后处理,例如:权限验证、日志记录等。拦截器的优点是可以对请求进行更细粒度的控制,更加灵活,但是需要在Spring容器中使用。 过滤器是Servlet规范中的概念,通过实现Filter接口来实现。它可以拦截所有的请求,包括静态资源的请求,过滤器是在请求到达目标资源之前进行拦截处理,可以进行一些预处理,例如:字符编码转换、XSS攻击防范等。过滤器的优点是可以对所有的请求进行统一处理,但是无法对请求的处理过程进行干预。 综上所述,拦截器和过滤器都是Java Web开发中常用的组件,它们都可以对请求进行拦截和处理,但是拦截器更加灵活,可以对请求进行更细粒度的控制;过滤器则可以对所有的请求进行统一处理。 ### 回答2: 拦截器和过滤器是在Java Web开发中常用的两种组件,用于处理请求和响应。 1. 拦截器(Interceptor): 拦截器是基于Java的动态代理机制实现的,主要用于在请求处理的前后执行一些额外的逻辑。它通常被用于AOP(面向切面编程)中,可以实现日志记录、性能监控、权限验证等功能。拦截器可以拦截Controller中的方法,对其中的参数和返回值进行处理。拦截器的生命周期由框架控制,通常可以在配置文件中声明。 2. 过滤器(Filter): 过滤器是Java Servlet规范中定义的一种机制,用于在请求到达目标资源之前和离开目标资源之后执行一系列的操作。它可以用于过滤请求参数、处理编码、过滤敏感信息等。过滤器的生命周期也由容器管理,可以在Web.xml文件中配置。 区别: 1. 实现方式:拦截器是基于动态代理实现的,而过滤器是Java Servlet规范中定义的一种组件。 2. 作用对象:拦截器作用于Controller中的方法,而过滤器作用于整个请求(包括请求参数、URL、头部信息等)。 3. 调用顺序:拦截器只关心对Controller方法的拦截,它可以在方法执行前后进行操作。过滤器在请求到达目标资源之前执行,离开目标资源之后执行,也就是在Controller方法执行前后的两个时间点都会执行过滤器。 4. 生命周期:拦截器的生命周期由框架控制,而过滤器的生命周期由容器管理。 综上所述,拦截器和过滤器在实现方式、作用对象、调用顺序和生命周期等方面存在一定的差异。在使用时,我们可以根据具体需求选择合适的组件来完成相应的任务。 ### 回答3: 拦截器和过滤器都是在Java开发中常用的组件,用于对请求进行处理和加工。它们的主要区别在于作用范围、运行顺序和使用方式。 首先,拦截器是在Spring框架中使用的概念,而过滤器是在Java Servlet规范中定义的。所以,拦截器在Spring MVC项目中使用得较多,而过滤器则在Java Web项目中常见。 其次,拦截器是基于面向切面编程的思想,它可以拦截并加工控制器层的请求和响应,对其进行处理。而过滤器是对请求进行处理的一种通用机制,它可以对所有的请求进行拦截和处理,比如对请求进行认证、日志记录等操作。 在运行顺序上,拦截器是在控制器(Controller)处理请求之前或之后执行的,可以在处理请求之前进行权限检查、参数校验等操作,也可以在处理请求之后进行日志记录、结果处理等操作。而过滤器则是在请求进入容器之前或之后执行的,它对请求进行拦截和加工,可以对请求参数、请求头等进行修改或加工。 此外,拦截器是通过Spring框架进行管理和配置的,可以使用注解或配置文件来定义拦截器的使用范围和顺序。过滤器则是在web.xml文件中进行配置的,可以配置多个过滤器,并按照配置的顺序进行执行。 综上所述,拦截器和过滤器在作用范围、运行顺序和使用方式上存在一些差异。对于Java领域的专家来说,理解和熟练运用拦截器和过滤器的区别能够帮助我们更好地进行代码编写和项目开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

volcanical

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值