牛客NC288803 和+和

 ​
 import java.util.Comparator;
 import java.util.PriorityQueue;
 import java.util.Scanner;
 ​
 public class Main {
     public static void main(String[] args) {
         // 创建Scanner对象用于读取输入
         Scanner sc = new Scanner(System.in);
         // 读取两个整数n和m,分别表示数组的长度和窗口的大小
         int n = sc.nextInt(); 
         int m = sc.nextInt();
         // 初始化两个数组a和b,用于存储输入的两个数组
         long a[] = new long[n + 1];
         long b[] = new long[n + 1];
         // 读取数组a的元素
         for (int i = 1; i <= n; i++) a[i] = sc.nextLong();
         // 读取数组b的元素
         for (int i = 1; i <= n; i++) b[i] = sc.nextLong();
         // 初始化前缀和数组pre和后缀和数组hen
         long pre[] = new long[n + 1];
         long hen[] = new long[n + 1];
         // 创建两个优先队列,用于维护窗口内的最大值
         PriorityQueue<Long> q1 = new PriorityQueue<>(Comparator.reverseOrder());
         PriorityQueue<Long> q2 = new PriorityQueue<>(Comparator.reverseOrder());
         
         // 计算数组a的前缀和
         for (int i = 1; i <= m; i++) {
             pre[i] = pre[i - 1] + a[i];
         }
         // 计算数组b的后缀和
         hen[n] = b[n];
         for (int i = n - 1; i >= n - m + 1; i--) {
             hen[i] = hen[i + 1] + b[i];
         }
         
         // 维护数组a的窗口最大值
         for (int i = 1; i <= n; i++) {
             q1.add(a[i]);
             if (q1.size() > m) {
                 long t1 = q1.poll();
                 pre[i] = pre[i - 1];
                 pre[i] += (a[i] - t1);
             }
         }
         // 维护数组b的窗口最大值
         for (int i = n; i >= 1; i--) {
             q2.add(b[i]);
             if (q2.size() > m) {
                 long t2 = q2.poll();
                 hen[i] = hen[i + 1];
                 hen[i] += (b[i] - t2);
             }
         }
         
         // 枚举分界点,计算最小值
         long ans = Long.MAX_VALUE;
         for (int i = m; i <= n - m; i++) {
             ans = Math.min(ans, pre[i] + hen[i + 1]);
         }
         // 输出结果
         System.out.println(ans);
     }
 }
 ​
  1. 基本语法

    • 变量声明和初始化。

    • 循环结构(for循环)。

    • 条件判断(if语句)。

  2. 数据结构

    • 数组(long[])的使用,用于存储输入的数组和前缀和、后缀和。

    • PriorityQueue优先队列的使用,用于维护一个动态的窗口最大值。

    在Java中,PriorityQueue 是一个基于优先级堆的无界优先队列,它使用自然排序或者通过在构造器中指定的 Comparator 来排序其元素。以下是关于 PriorityQueue 在这段代码中如何用于维护一个动态窗口最大值的详细解释: PriorityQueue 的基本特性: 优先级排序:PriorityQueue 会根据元素的优先级顺序来排列元素。默认情况下,它是一个最小堆,但你可以通过传递一个 Comparator 实例来使其成为一个最大堆。 动态调整:当元素被添加到队列中或者从队列中移除时,PriorityQueue 会自动调整元素的位置以保持堆的特性。 在代码中的应用: 在提供的代码片段中,PriorityQueue 被用来维护滑动窗口中的最大值。这里是具体的应用步骤: 初始化两个优先队列: PriorityQueue<Long> q1 = new PriorityQueue<>(Comparator.reverseOrder()); PriorityQueue<Long> q2 = new PriorityQueue<>(Comparator.reverseOrder()); 这里创建了两个最大堆,q1 和 q2,分别用于处理数组 a 和 b 的元素。 填充优先队列: 在处理数组时,代码会将窗口内的元素添加到对应的优先队列中。例如,对于数组 a,代码可能会这样做: for (int i = 0; i < m; i++) { q1.add(a[i]); } 这样,q1 中就包含了数组 a 的前 m 个元素,且队列的头部始终是这 m 个元素中的最大值。 维护窗口: 当窗口在数组上滑动时,需要从队列中移除窗口前面的元素,并添加新的元素。例如: if (q1.size() > m) { q1.poll(); // 移除窗口前面的元素 } q1.add(a[i]); // 添加新的元素到窗口 通过这种方式,q1 始终保持窗口内的最大值在队列头部。 获取窗口最大值: 由于 q1 是一个最大堆,所以队列头部的元素就是窗口内的最大值。可以使用 q1.peek() 来获取这个值而不移除它,或者使用 q1.poll() 来获取并移除这个值。 为什么使用 PriorityQueue? 使用 PriorityQueue 而不是其他数据结构(如数组或列表)的原因是它可以更高效地维护窗口的最大值。在数组或列表中,每次窗口滑动时,都需要遍历窗口内的所有元素来找到最大值,这会导致时间复杂度为 O(m)。而使用 PriorityQueue,添加和移除元素的操作的时间复杂度是 O(log m),因此总体上可以更高效地处理滑动窗口问题。 总之,PriorityQueue 在这段代码中用于动态地跟踪和维护滑动窗口中的最大值,这是解决某些特定类型数组问题的有效方法。

  3. 算法

    • 前缀和算法,用于计算数组前i个元素的和。

    • 后缀和算法,用于计算数组从第i个元素到末尾的和。

    • 滑动窗口算法,通过优先队列来维护窗口内的最大值。

  4. Java标准库

    • Scanner类的使用,用于读取输入。

    • Comparator接口的使用,用于定义优先队列的排序规则。

      在Java中,Comparator接口是一个功能强大的工具,它允许程序员定义自己的排序规则,而不必依赖于对象类的自然排序(即实现Comparable接口的排序)。Comparator接口在许多场景中都非常有用,尤其是在使用集合框架中的排序和搜索操作时,比如在PriorityQueue、TreeSet或Collections.sort()方法中。 以下是关于Comparator接口的进一步解释: Comparator接口的基本概念: Comparator是一个函数式接口,这意味着它只有一个抽象方法,即compare(T o1, T o2),它用于比较两个类型为T的对象。 compare方法接受两个参数,并根据以下规则返回一个整数值: 如果o1小于o2,则返回负整数。 如果o1等于o2,则返回零。 如果o1大于o2,则返回正整数。 Comparator接口的使用: 在PriorityQueue的上下文中,Comparator用于定义队列中元素的排序规则。以下是如何使用Comparator来创建一个最大堆的例子: PriorityQueue<Long> q1 = new PriorityQueue<>(Comparator.reverseOrder()); 在这个例子中,Comparator.reverseOrder()是一个静态方法,它返回一个Comparator实例,该实例对实现了Comparable接口的对象的自然顺序进行反转。对于基本类型Long,这意味着队列将按照数值的降序排列,即队列头部将始终是最大的元素。 如果你想要定义一个自定义的排序规则,你可以创建一个实现了Comparator接口的匿名类或者使用lambda表达式,如下所示: // 使用匿名类 PriorityQueue<Long> q1 = new PriorityQueue<>(new Comparator<Long>() { @Override public int compare(Long o1, Long o2) { return o2.compareTo(o1); // 反转比较,实现最大堆 } }); // 使用lambda表达式 PriorityQueue<Long> q1 = new PriorityQueue<>((o1, o2) -> o2.compareTo(o1)); 在上述代码中,无论是使用匿名类还是lambda表达式,我们都定义了一个比较器,它将两个Long对象按照降序排列。 为什么使用Comparator? 使用Comparator的主要优势在于它的灵活性和可定制性。它允许你: 为没有实现Comparable接口的类定义排序规则。 为已经实现Comparable接口的类提供不同的排序规则。 在运行时动态地改变排序规则,而不必修改类的内部实现。 总之,Comparator接口是Java集合框架中一个强大的工具,它使得排序和搜索操作更加灵活和可定制。

  5. 数学运算

    • 使用Math.min函数来找出最小值。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025 软件供应链安全情报预警平台建设与实践

何为数字安全供应链情报&#xff1f; 所谓的数字供应链开源安全情报主要针对目标是开源数字应用资产。包括开源组件&#xff0c;中间件和操作系统。开源安全情报类型可以分为三大类&#xff1a; 1 第一类是传统的安全漏洞风险情报&#xff0c;开源漏洞情报数据获取主要有2种渠…

红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测

文章目录 ​​研判&#xff08;入侵检测&#xff09;​​ ​​设备​​ ​​经典网络​​​​云网络​​ ​​异常HTTP请求​​​​Webshell分析​​ ​​Webshell 的分类​​​​Webshell 的检测​​ ​​主机层面​​​​流量层面​​ ​​附录​​ ​​常见端口漏洞…

【Python系列】Python 连接 PostgreSQL 数据库并查询数据

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

DeepSeek赋能智慧社区:提升社区治理,优化资源配置,带来全新变革

在数字化浪潮的推动下&#xff0c;智慧社区正逐渐成为城市发展的重要方向。作为一款先进的人工智能大模型&#xff0c;DeepSeek凭借其强大的多模态数据分析和智能决策能力&#xff0c;正在为智慧社区的建设注入新的活力。 标准规范及顶层设计指南、供应商整体解决方案合集、供应…

代理服务器与内网穿透/打洞

内网穿透 简单来说内网穿透就是让一个在私人IP的设备&#xff0c;能在公网上被别的主机访问到资源。 中间经过服务器将获取的数据转发给主机。 内网打洞 内网打洞&#xff0c;也叫 P2P 穿透或 NAT 穿越&#xff0c;是一种用于实现位于不同内网中的设备之间直接建立连接的技…

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链&#xff0c;继续使用基于 langgraph 链 &#xff0c;对结构化数据库 SQlite 进行查询的方法。该系统建立以后&#xff0c;我们不需要掌握专业的 SQL 技能&#xff0c;可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…

Geek卸载软件安装使用教程

文章目录 一、Geek下载二、使用步骤 一、Geek下载 Geek Uninstallers最新版是一款高效、快速、小巧、免费的软件卸载与清理工具&#xff0c;旨在帮助用户删除系统上安装的程序。不同于其他的卸载程序&#xff0c;Geek Uninstaller执行深入扫描进程&#xff0c;并清除软件卸载后…

BIO、NIO、AIO解析

一、基础概念 1、IO的含义 IO&#xff0c;Input/Output&#xff0c;即输入/输出。从计算机结构来看&#xff0c;IO描述了计算机系统和外部设备之间通讯的过程。从应用程序角度来看&#xff0c;一个进程的地址空间划分为 用户空间&#xff08;User space&#xff09; 和 内核空…

抖音生活服务加强探店内容治理,2024年达人违规率下降30%

发布 | 大力财经 2月27日&#xff0c;抖音生活服务发布《2024抖音生活服务消费者权益保护年度报告》&#xff08;以下简称“报告”&#xff09;。报告显示&#xff0c;过去一年&#xff0c;抖音生活服务针对消费者反感的虚假、夸张探店内容&#xff0c;开展了专项治理。通过一…

Apollo Cyber 学习笔记

目录 0 Introduction What Why Advantage 1 Example 2 Concept 3 Flow Chart 4 Module 4.1 Transport 4.1.1 Share Memory 4.1.1.1 Segment 4.1.1.1.1 State 4.1.1.1.2 Block 4.1.1.1.3 Common 4.1.1.2 Notifier 4.1.1.2.1 ConditionNotifier 4.1.1.2.2 Multi…

企业如何挖掘数据资产价值?

本期推荐&#xff1a;挖掘数据资产价值&#xff0c;赋能企业发展&#xff0c;共28页ppt。 关注WeChat Subscription Account【智慧城市指北】&#xff0c;回复关键字“20250228数据资产”&#xff0c;获取获得本文电子版材料的方式(非无偿&#xff09;~ 篇幅限制&#xff0c;…

FastExcel vs EasyExcel vs Apache POI:三者的全面对比分析

一、核心定位与历史沿革 Apache POI&#xff08;1990s-&#xff09; 作为Java生态中最古老的Excel处理库&#xff0c;提供对.xls/.xlsx文件的全功能支持。其核心价值在于对Excel规范的完整实现&#xff0c;包括单元格样式、公式计算、图表操作等深度功能。但存在内存消耗大&…

千峰React:Hooks(下)

useLayoutEffect useLayoutEffect在useEffect之前触发 这样会闪屏&#xff0c;因为是异步的&#xff0c;两次都渲染了 import {useEffect,useState } from react;function App() {const [msg,setMsg] useState(hello App)useEffect(() > {setMsg(hello useEffect)});retu…

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下&#xff0c;开源社区已成为推动技术创新的核心力量。盛京开源社区&#xff08;SJOSC&#xff09;作为沈阳地区的开源交流平台&#xff0c;始终致力于连接开发者、企业及高校&#xff0c;构建区域技术生态圈。 现在&#xff0c;盛京开源…

Unity:实时查看和调试日志信息(In-game Debug Console插件)

在Unity中使用In-game Debug Console插件可以方便地在应用内实时查看和调试日志信息。 1、导入插件 从Packages:My Assets导入In-game Debug Console插件&#xff0c;导入后&#xff0c;插件会自动添加到项目的Packages文件夹中。&#xff08;需要先下载该插件&#xff09; 2、…

SQL Server的安装和简单使用

目录 一、SQL Server 1.1、简介 1.2、安装包 二、安装SQL Server 2.1、双击安装包 2.2、选择自己想要安装的位置 2.3、点击安装 2.4、安装完成之后会出现以下页面&#xff0c;按照序号依次点击 2.5、不用管密钥&#xff0c;点击下一步 2.6、选择【我接受】 2.7、是否…

Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替

如题&#xff0c;笔者在Cursor中使用pycharm写python程序&#xff0c;试用期到了Tab自动补全功能就不能用了&#xff0c;安装Codeuim插件可以代替这个功能。步骤如下&#xff1a; 1. 在应用商店中搜索扩展Codeuim&#xff0c;下载安装 2. 安装完成后左下角会弹出提示框&#x…

<tauri><rust><GUI>基于tauri,实现websocket通讯程序(右键菜单、websocket)

前言 本文是基于rust和tauri&#xff0c;由于tauri是前、后端结合的GUI框架&#xff0c;既可以直接生成包含前端代码的文件&#xff0c;也可以在已有的前端项目上集成tauri框架&#xff0c;将前端页面化为桌面GUI。 环境配置 系统&#xff1a;windows 10平台&#xff1a;vis…

【官方配图】win10/win11 安装cuda 和 cudnn

文章目录 参考资料1.安装cuda toolkit1. 下载安装包2.安装验证 2. 安装cudnn下载cudnn安装包安装cudnn安装后的配置 参考资料 官方nvidia安装cuda官方nvidia安装cudnn 1.安装cuda toolkit 1. 下载安装包 下载地址 https://developer.nvidia.com/cuda-downloads?target_osW…

【监督学习】K 邻近算法步骤及matlab实现

K 邻近算法 &#xff08;三&#xff09;K 邻近算法1.算法步骤2. MATLAB 实现参考资料 &#xff08;三&#xff09;K 邻近算法 K 近邻算法&#xff08;KNN&#xff0c;K-Nearest Neighbors&#xff09;是一种简单且直观的监督学习方法&#xff0c;可用于分类和回归任务。它的工…