蓝桥每日打卡--区间移位

news2025/3/22 18:30:32

#蓝桥#JAVA#区间移位

题目描述

数轴上有n个闭区间:D1,⋯Dn。

其中区间Di用一对整数[ai,bi]来描述,满足 ai≤bi。

已知这些区间的长度之和至少有10^{4_{}}

所以,通过适当的移动这些区间,你总可以使得他们的"并"覆盖 [0,10^{4_{}}],也就是说 [0,10^{4_{}}]这个区间内的每一个点都落于至少一个区间内。

你希望找一个移动方法,使得位移差最大的那个区间的位移量最小。

具体来说,假设你将Di移动到 [ai+ci,bi+ci]这个位置。你希望使得max⁡∣ci∣最小。

解题思路

首先这道题可以参考蓝桥每日打卡--打家劫舍4-CSDN博客这个最小化最大值的思路

①选取数组不相邻元素 ②限选≥k≥k个 ③求最大值(单个方案中能偷最多的)中的最小值(所有方案汇聚而成的可行域中的最小值)

触发条件:看到最大化最小值最小化最大值,就要想到二分答案,这是固定套路

  • 本题的二分指的是答案的二分——虽然nums不是单调的,但答案的取值范围是单调的,可以二分查找区间的最小值
区间 [0, max_element]:

|   不满足条件的区间   | 单次能偷的最大值范围(答案所在区间) |
                       ↑
                  要找的在这里

  • check函数:判断单次窃取上限为maxL时,能否偷满至少k
  • minCapability函数:对答案所在区间进行二分查找
    • 因为答案分布在所有可能的结果中,所以将左指针初始化为0,右指针初始化为数组最大值
    • 要找的是答案所在区间的最小值

贪心+二分查找

int minCapability(int[] nums, int k) {
    int left = 0, right = Integer.MIN_VALUE;
    for (int num : nums) right = Math.max(right, num);
    while (left < right) {
        int mid = (left + right) >> 1;
        if (check(nums, mid, k)) right = mid;
        else left = mid + 1;
    }
    return right;
}

boolean check(int[] nums, int cap, int k) {
    int count = 0;
    for (int i = 0; i < nums.length; ++i) {
        if (nums[i] <= cap) {
            ++count;
            ++i; // 跳过相邻的
        }
    }
    return count >= k;
}

 

import java.util.*;

public class Main {
    // 定义一个二维数组 intervals,用于存储输入的区间信息
    private static int[][] intervals;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        intervals = new int[n][2];
        for (int i = 0; i < n; ++i) {
            // 读取每个区间的左端点,并将其乘以 2,这样做是为了方便后续计算,避免在计算位移量时进行除法操作
            intervals[i][0] = 2 * scan.nextInt();
            // 读取每个区间的右端点,并将其乘以 2
            intervals[i][1] = 2 * scan.nextInt();
        }
        scan.close();
        // 对 intervals 数组按照每个区间的右端点进行排序,使用 Comparator.comparingInt 方法指定排序规则
        Arrays.sort(intervals, Comparator.comparingInt(i -> i[1]));

        // 初始化二分查找的左边界为 0
        int left = 0;
        // 初始化二分查找的右边界为 20000,这里假设最大的位移量不会超过 20000
        int right = (int) 2e4;
        // 开始二分查找,使用左闭右开区间的二分查找模板
        while (left < right) { 
            // 计算中间值 mid,使用位运算 >> 1 代替除以 2,提高计算效率
            int mid = (left + right) >> 1;
            // 调用 check 方法检查当前位移量 mid 是否满足条件
            if (check(mid)) 
                // 如果满足条件,说明 mid 可能是一个可行解,将右边界更新为 mid,缩小查找范围
                right = mid;
            else
                // 如果不满足条件,说明 mid 太小,将左边界更新为 mid + 1,扩大查找范围
                left = mid + 1;
        }
        // 判断最终结果是否为偶数
        if (right % 2 == 0) 
            // 如果是偶数,直接将结果除以 2 并输出
            System.out.println(right / 2);
        else
            // 如果是奇数,将结果转换为 double 类型后除以 2 并输出
            System.out.println((double) right / 2);
    }

    // 定义 check 方法,用于检查给定的位移量 shift 是否能使所有区间覆盖到指定范围
    private static boolean check(int shift) {
        // 初始化覆盖范围为 0
        int cover = 0;
        // 创建一个 ArrayList 并将 intervals 数组中的元素复制到其中,方便后续的删除操作
        List<int[]> temp = new ArrayList<>(Arrays.asList(intervals)); 
        // 进入一个无限循环,用于逐个处理区间
        while (true) {
            // 标记是否有合格的区间,初始化为 false
            boolean qualified = false;
            // 遍历 temp 列表中的每个区间
            for (int i = 0; i < temp.size(); ++i) {
                // 获取当前区间
                int[] interval = temp.get(i);
                // 检查当前区间向左移动 shift 后是否能连接到前面的覆盖范围,并且向右移动 shift 后不超过最大范围
                if (interval[0] - shift <= cover && interval[1] + shift >= cover) {
                    // 如果满足条件,标记有合格的区间
                    qualified = true;
                    // 计算当前区间的长度
                    int len = interval[1] - interval[0];
                    // 如果当前区间左移后超过前面区间的覆盖范围,那么此次移动,覆盖范围最多只能增加当前区间本身的长度
                    if (interval[0] + shift >= cover) 
                        cover += len;
                    else
                        // 若不能超过,覆盖范围最多是当前区间末端 + 位移量
                        cover = interval[1] + shift;
                    // 从 temp 列表中移除当前区间
                    temp.remove(i);
                    // 跳出当前 for 循环,避免 ConcurrentModificationException 异常
                    break; 
                }
            }
            // 如果没有合格的区间或者覆盖范围已经达到 20000,跳出无限循环
            if (!qualified || cover >= 2e4) break;
        }
        // 判断最终的覆盖范围是否达到 20000,如果达到则返回 true,否则返回 false
        return cover >= 2e4;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CUDAOpenCV 基于Hessian矩阵计算特征值

文章目录 一、简介二、实现代码三、实现效果一、简介 基于之前的博客:CUDA&OpenCV Hessain矩阵计算,我们可以计算出每个像素的特征值: 二、实现代码 ComputeHessainMatrix.cuh #ifndef HESSAIN_GPU_CUH #

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

PostgreSQL_数据表结构设计并创建

目录 前置&#xff1a; 1 数据表设计思路 2 数据表格SQL 3 创建 3.1 创建数据库 db_stock 3.2 在 pgAdmin4 中创建表 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文 1 数据表设计思路 1 日数据来自优矿&#xff0c;优矿的数据…

如何在MCU工程中启用HardFault硬错误中断

文章目录 一、HardFault出现场景二、启动HardFault三、C代码示例 一、HardFault出现场景 HardFault&#xff08;硬故障&#xff09; 错误中断是 ARM Cortex-M 系列微控制器中一个较为严重的错误中断&#xff0c;一旦触发&#xff0c;表明系统遇到了无法由其他异常处理机制解决…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…

卷积神经网络 - 卷积层(具体例子)

为了更一步学习卷积神经网络之卷积层&#xff0c;本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念&#xff0c;一个针对灰度图像&#xff0c;一个针对彩色图像。 例子 1&#x…

测试Claude3.7 sonnet画蛋白质

测试Claude3.7 sonnet画蛋白虽然画的很粗糙&#xff0c;但是大致画了出来

java项目之基于ssm的游戏攻略网站(源码+文档)

项目简介 游戏攻略网站实现了以下功能&#xff1a; 管理员主要负责填充图书和其类别信息&#xff0c;并对已填充的数据进行维护&#xff0c;包括修改与删除&#xff0c;管理员也需要审核老师注册信息&#xff0c;发布公告信息&#xff0c;管理自助租房信息等。 &#x1f495;…

本地基于Ollama部署的DeepSeek详细接口文档说明

前文&#xff0c;我们已经在本地基于Ollama部署好了DeepSeek大模型&#xff0c;并且已经告知过如何查看本地的API。为了避免网络安全问题&#xff0c;我们希望已经在本地调优的模型&#xff0c;能够嵌入到在本地的其他应用程序中&#xff0c;发挥本地DeepSeek的作用。因此需要知…

python NameError报错之导库报错

在日常代码编写中&#xff0c;经常出现如 图1 一样的报错&#xff0c;在代码多时很难找到问题&#xff0c;但翻看代码后就会发现是因为未导库&#xff0c; 图1 报错 代码: time.sleep(0.1) print("time库") 解决方法: 第一步:在代码中添加导库代码 import time #…

Web3网络生态中数据保护合规性分析

Web3网络生态中数据保护合规性分析 在这个信息爆炸的时代&#xff0c;Web3网络生态以其独特的去中心化特性&#xff0c;逐渐成为数据交互和价值转移的新平台。Web3&#xff0c;也被称为去中心化互联网&#xff0c;其核心理念是将数据的控制权归还给用户&#xff0c;实现数据的…

C++ 语法之数组指针

一维数组&#xff1a; 如果我们定义了一个一维数组&#xff0c;那么这个数组名&#xff0c;就是指向第一个数组元素的地址&#xff0c;也即&#xff0c;是整个数组分配的内存空间的首地址。 比如 int a[3]; 定义了一个包含三个元素的数组。因为一个int占4个字节&#xff0c;那…

PLY格式文件如何转换成3DTiles格式——使用GISBox软件实现高效转换

一、概述 在三维GIS和数字孪生领域&#xff0c;3DTiles格式已成为主流的数据格式之一。它由Cesium团队提出&#xff0c;专为大规模3D数据可视化设计&#xff0c;能够高效地加载和展示海量模型数据。而PLY格式则是一种常见的三维模型文件格式&#xff0c;主要用于存储点云数据或…

Java定时任务的三重境界:从单机心跳到分布式协调

《Java定时任务的三重境界&#xff1a;从单机心跳到分布式协调》 本文将以生产级代码标准&#xff0c;揭秘Java定时任务从基础API到分布式调度的6种实现范式&#xff0c;深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异&#xff0c;并给出各方案的性能压…

【Linux网络】手动部署并测试内网穿透

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

java项目之在线购物系统(源码+文档)

项目简介 在线购物系统实现了以下功能&#xff1a; 使用在线购物系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的…

OO_Unit1

第一次作业 UML类图 代码复杂度分析 其中Expr中的toString方法认知复杂度比较高&#xff0c;主要源于多层条件嵌套和分散的字符串处理逻辑&#xff0c;重构时可重点关注这两部分的解耦。 代码量分析 1.”通用形式“ 我觉得我的设计的最大特点就是“通用形式”&#xff0c;具…

重要重要!!fisher矩阵元素有什么含义和原理; Fisher 信息矩阵的形式; 得到fisher矩阵之后怎么使用

fisher矩阵元素有什么含义和原理 目录 fisher矩阵元素有什么含义和原理一、对角线元素( F i , i F_{i,i} Fi,i​)的含义与原理二、非对角线元素( F i , j F_{i,j} Fi,j​)的含义与原理Fisher 信息矩阵的形式矩阵的宽度有位置权重数量决定1. **模型参数结构决定矩阵维度**2.…

[已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退

jupyter notebook出现如上图的报错&#xff0c;可以在黑色窗口中检查是为什么报错。 我检查发现是nbconvert导致的问题&#xff0c;卸载重装nbconvert。 但是这时候出现&#xff0c;jupyter notebook闪退问题。jupyter的黑色窗口出现一秒钟就没了。 在Anaconda Prompt中检查ju…

2025年渗透测试面试题总结- 某亭-安全研究员(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、SQL注入过滤单引号绕过方法 二、MySQL报错注入常用函数 三、报错注入绕WAF 四、MySQL写文件函数…