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

embedded/2025/3/23 0:16:37/

#蓝桥#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,右指针初始化为数组最大值
    • 要找的是答案所在区间的最小值

贪心+二分查找

java">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;
}

 

java">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();// 读取每个区间的右端点,并将其乘以 2intervals[i][1] = 2 * scan.nextInt();}scan.close();// 对 intervals 数组按照每个区间的右端点进行排序,使用 Comparator.comparingInt 方法指定排序规则Arrays.sort(intervals, Comparator.comparingInt(i -> i[1]));// 初始化二分查找的左边界为 0int left = 0;// 初始化二分查找的右边界为 20000,这里假设最大的位移量不会超过 20000int 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) {// 初始化覆盖范围为 0int cover = 0;// 创建一个 ArrayList 并将 intervals 数组中的元素复制到其中,方便后续的删除操作List<int[]> temp = new ArrayList<>(Arrays.asList(intervals)); // 进入一个无限循环,用于逐个处理区间while (true) {// 标记是否有合格的区间,初始化为 falseboolean 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,否则返回 falsereturn cover >= 2e4;}
}


http://www.ppmy.cn/embedded/174829.html

相关文章

基于Java(springMVC+hibernate)+Mysql实现(Web)客栈服务系统

HostelWord 客栈服务系统 1.数据库设计 1.1 数据库表 备注&#xff1a; hostel id&#xff1a;7 为 9990001 开始 自增 vip id&#xff1a;7 位 1000000 开始 自增 userid 与 hostel&#xff0c;vip 的 id 一一对应 room id &#xff1a;6 位 自增 bill id &#xff1a;8 …

简单理解机器学习中top_k、top_p、temperature三个参数的作用

在机器学习中&#xff0c;top_k、top_p 和 temperature 是用于控制生成模型&#xff08;如语言模型&#xff09;输出质量的参数&#xff0c;尤其在文本生成任务中常见。然而&#xff0c;网上文章很多很全&#xff0c;但大多晦涩难懂&#xff0c;今天我们来用最简单的语言谈谈它…

VSCode配置C语言保姆课

一、mingw-w64下载及配置 1.mingw下载 现在mingw的官网中没有之前的界面了&#xff0c;很容易让大家伙找错版本。所以我就把安装包分享出来吧&#xff0c;对应的是原官网界面中所框选的版本&#xff0c;适配64位操作系统的seh。网盘链接如下&#xff1a; 通过网盘分享的文件&…

华为云-图像识别API服务调用

1&#xff0e;开通服务使用图像识别服务之前&#xff0c;必须先申请并开通服务。①登录后跳转至控制台页面&#xff0c;点击左上角服务列表按钮&#xff0c;在搜索框中输入“image”&#xff0c;在结果中找到【图像识别Image】并点击&#xff0c;即可进入图像识别服务控制台&am…

在K8S中挂载 Secret 到 Pod

在 Kubernetes 里&#xff0c;把 Secret 挂载到 Pod 中有两种主要方式&#xff1a;作为卷挂载和作为环境变量挂载。下面为你提供相应的代码示例。 作为卷挂载 Secret 将 Secret 作为卷挂载到 Pod 时&#xff0c;Secret 的每个键会成为挂载目录下的一个文件&#xff0c;文件内…

英伟达消费级RTX显卡配置表

显卡型号显存大小显存频率显存位宽显存带宽CUDA核心数TDP&#xff08;功耗&#xff09;上市年份RTX 409024GB21 Gbps384-bit1,008 GB/s16,384450W2022RTX 4080 (16GB)16GB22.4 Gbps256-bit716.8 GB/s9,728320W2022RTX 4080 (12GB)12GB21 Gbps192-bit504 GB/s7,680285W2023RTX 4…

Oracle 公布 Java 的五大新功能

Java 增强提案包括语言增强和性能优化&#xff0c;从 JDK 25 中的稳定值 API 开始。 随着JDK&#xff08;Java 开发工具包&#xff09;24刚刚全面上市&#xff0c;Oracle 提前透露了不久的将来即将推出的 Java 功能&#xff0c;包括增强原始装箱到空限制值类类型。 3 月 18 日…

Vue 3 打包优化实战指南:从构建到部署的全链路性能提升

本指南将基于一个真实的博客项目&#xff0c;通过7个关键优化步骤&#xff0c;将打包体积从初始的3.2MB压缩到最终的412KB&#xff0c;首屏加载时间从4.1秒降至0.8秒。所有操作均可直接在项目中实践验证。 一、项目初始化与基准测试 1. 创建示例博客项目 npm create vuelates…