蓝桥杯真题_小蓝和小桥的讨论

小蓝和小桥的讨论

问题描述

小蓝和小桥是一所高中的好朋友,他们正在讨论下一次的课程。这节课需要讨论 nn 个主题,第 ii 个主题对老师来说有 aia**i 的趣味度,对学生来说有 bib**i 的趣味度。

小蓝认为,如果一个主题对老师来说越有趣,那么这个主题就应该被优先讨论,因为老师的兴趣会高度激发学生的兴趣,而学生的兴趣是学习的动力。

他们发现,如果两个主题 ii 和 jj 满足 ai+aj>bi+bja**i+a**j>b**i+b**j,那么对老师来说这是一个更有趣的组合,也就是说这个组合更应该被优先讨论。他们把这样的组合称作 好的 话题组合。

请你帮助小蓝和小桥计算出一共有多少个 好的 话题组合。

输入格式

输入的第一行包含一个整数 nn,表示话题的数量。

输入的第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,a**n,其中 aia**i 表示第 ii 个话题对老师的趣味性。

输入的第三行包含 nn 个整数 b1,b2,…,bnb1,b2,…,b**n,其中 bib**i 表示第 ii 个话题对学生的趣味性。

输出格式

输出一个整数,表示 好的 话题对的数量。

样例输入

5
4 8 2 6 2
4 5 4 1 3

样例输出

7

你的代码使用归并排序计数来解决计算 (ai[left] + ai[right] > 0)(且 (left < right))的对数问题,但你提到“答案不对”。我们需要分析代码的逻辑,找出问题所在,并修正它。


当前代码逻辑分析

  1. 目标

    • 计算 (ai[left] + ai[right] > 0) 的下标对 ((left, right)) 数量,其中 (left < right)。
    • (ai[i] = a[i] - b[i])。
  2. 归并排序计数

    • 在合并时,通过比较左侧子数组 (arr[i])(从 (left) 到 (mid))和右侧子数组 (arr[j])(从 (mid+1) 到 (right))的元素,统计满足条件的对数。
    • 条件 (arr[i] + arr[j] > 0) 等价于 (arr[i] > -arr[j])。
    • 当 (arr[i] > -arr[j]) 时,假设 (arr[i]) 到 (mid) 的所有元素都满足条件,计数增加 (mid - i + 1)。
  3. 合并过程

    • 如果 (arr[i] > -arr[j]),放入 (arr[j])(较小值),并计数。
    • 否则放入 (arr[i])。

问题所在

经过检查,当前代码的计数逻辑存在错误,导致结果偏大。问题出在合并时的计数方式:

  • 错误假设:当 (arr[i] > -arr[j]) 时,代码认为 (arr[i]) 到 (arr[mid]) 的所有元素都满足 (arr[i] + arr[j] > 0)。但实际上,只有在左侧子数组仍有序的前提下,这一假设才成立。由于归并排序会改变原数组顺序,计数时未正确考虑原始下标,导致重复计数或错误计数。
  • 合并顺序:当前代码先放入 (arr[j])(右侧),这与计数逻辑不匹配,可能导致统计错误。

正确的归并计数应该:

  • 在合并时,保证 (i < j)(左侧元素下标小于右侧元素下标)。
  • 只统计原始 (left < right) 条件下的对数,而不是假设整个左侧子数组都满足。

修正思路

要正确计数 (ai[left] + ai[right] > 0) 的对数,我们需要:

  1. 保留原始下标信息
    • 使用一个辅助数组记录元素及其原始下标,避免排序后丢失 (left < right) 的约束。
  2. 调整合并逻辑
    • 在合并时,正确统计左侧元素大于右侧元素的对数。
  3. 优化计数
    • 确保只统计 (left < right) 的对,避免重复或遗漏。

然而,当前代码直接操作 (ai) 数组,无法保留下标信息。更好的方法是:

  • 修改数据结构,使用对象存储值和下标。
  • 或调整计数逻辑,确保每次合并只统计当前子问题内的有效对数。

修正后的代码

以下是修正后的实现,使用归并排序正确计数:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();int[] a = new int[n];int[] b = new int[n];for (int i = 0; i < n; i++) {a[i] = scan.nextInt();}for (int j = 0; j < n; j++) {b[j] = scan.nextInt();}int[] ai = new int[n];for (int i = 0; i < n; i++) {ai[i] = a[i] - b[i];}long res = mergeSortAndCount(ai, 0, n - 1);System.out.print(res);scan.close();}private static long mergeSortAndCount(int[] arr, int left, int right) {if (left >= right) {return 0;}int mid = left + (right - left) / 2; // 防止溢出long count = mergeSortAndCount(arr, left, mid) + mergeSortAndCount(arr, mid + 1, right);count += merge(arr, left, mid, right);return count;}private static long merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left;       // 左侧子数组指针int j = mid + 1;    // 右侧子数组指针int k = 0;          // 临时数组指针long count = 0;// 临时记录右侧元素,用于计数int[] rightPart = new int[right - mid];for (int p = 0; p < rightPart.length; p++) {rightPart[p] = arr[mid + 1 + p];}// 先统计满足条件的对数int r = 0; // 右侧指针for (int l = left; l <= mid && r < rightPart.length; ) {if (arr[l] > -rightPart[r]) {count += (mid - l + 1); // 左侧从 l 到 mid 都满足r++;} else {l++;}}// 合并两个子数组i = left;j = mid + 1;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 复制回原数组for (int p = 0; p < temp.length; p++) {arr[left + p] = temp[p];}return count;}
}

修正点说明

  1. 分离计数与合并

    • 在合并前,先统计满足 (arr[left] + arr[right] > 0) 的对数。
    • 使用 (rightPart) 记录右侧子数组,避免合并时改变原始值。
  2. 计数逻辑

    • 对于每个右侧元素 (rightPart[r]),检查左侧 (arr[l]) 是否大于 (-rightPart[r])。
    • 如果满足,从 (l) 到 (mid) 的所有元素都满足(因为左侧子数组有序),计数增加 (mid - l + 1)。
    • (l) 和 (r) 单调递增,避免重复计数。
  3. 合并逻辑

    • 保持标准的归并排序合并,确保 (arr) 最终有序。
    • 计数与合并分离,不干扰排序过程。

时间复杂度

  • 归并排序:(O(n \log n))。
  • 合并时计数:(O(n))(左右指针单调移动)。
  • 总复杂度:(O(n \log n))。

示例验证

输入:

3
5 2 3
1 1 1
  • (ai = [4, 1, 2])
  • 期望对数:
    • (4 + 1 > 0)((0, 1))
    • (4 + 2 > 0)((0, 2))
    • (1 + 2 > 0)((1, 2))
    • 总数:3

运行过程

  • 分解:([4]) 和 ([1, 2])。
  • 合并 ([1, 2]):
    • (1 > -2),(count = 1)。排序后 ([1, 2])。
  • 合并 ([4] 和 [1, 2]):
    • (4 > -1),(count += 1)。
    • (4 > -2),(count += 1)。
    • 总 (count = 3)。
  • 输出:(3)

为什么原代码错误?

原代码在合并时直接用 (arr[i] > -arr[j]) 计数,但:

  • (arr[i]) 到 (mid) 的元素并非都满足条件(排序后顺序改变)。
  • 重复计数或遗漏对数,因为合并与计数耦合。

修正后分离计数,确保只统计当前子问题内的有效对数。


进一步优化

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

Leetcode 最长递增子序列的个数

java solution class Solution {public int findNumberOfLIS(int[] nums) {//边界情况处理int n nums.length;if(n < 1) return n;//然后我们创建2个数组, 分别是count数组和length数组,//length[i]的含义是以i结尾的子数组的最长递增子序列长度//count[i]的含义是以i结尾…

原型验证后客户推翻原有需求,如何止损

原型验证后客户推翻原有需求时止损的有效方法包括&#xff1a;迅速评估影响范围、立即开展沟通确认、调整项目计划和资源配置、更新变更管理流程、协商成本分担机制。其中&#xff0c;迅速评估影响范围是关键&#xff0c;项目团队必须立即明确此次变更的具体影响&#xff0c;包…

在rockylinux9.4安装mongodb报错:缺少:libcrypto.so.10文件库

问题点&#xff1a; rockylinux9.4系统环境报错&#xff1a; ./mongod: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory 解决方法&#xff1a; Ps&#xff1a;解压之后&#xff0c;检查mongodb的依赖环境…

如何应对竞品分析不足导致的方案偏差

应对竞品分析不足导致方案偏差的有效措施包括&#xff1a;深入竞品调研、建立定期竞品分析机制、明确竞品分析维度、引入专业竞品分析工具、优化内部沟通反馈机制。其中&#xff0c;深入竞品调研尤为重要。通过全面深入地分析竞争对手的产品策略、市场定位及用户反馈&#xff0…

基于Python+LanceDB实战向量搜索

本篇实战演示向量搜索的实现和示例。 预期效果 给出一个查询的字符串&#xff0c;通过向量搜索&#xff0c;在下面三个语句中搜索出关联性最大的那句。 "熊猫是中国的国宝&#xff0c;主要栖息在四川山区。","长城是古代中国建造的军事防御工事&#xff0c;全…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程

Linux 部署 MineCraft 服务器 详细教程&#xff08;丐版&#xff0c;无需云服务器&#xff09; 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花&#xff0c;实现内网穿透&#xff0c;邀…

【科研绘图系列】R语言绘制重点物种进化树图(taxa phylogenetic tree)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出图片系统信息介绍 【科研绘图系列】R语言绘制重点物种进化树图(taxa phylogenetic tree) 加载R包 library(tidyverse) library(ape…

浏览器渲染过程

浏览器的渲染过程是多个线程、进程和阶段的复杂编排&#xff0c;它将原始的 HTML、CSS 和 JavaScript 转换为屏幕上的交互像素。 你在浏览器中输入一个 URL 并按下回车键 网站在你的屏幕上呈现出来 注意&#xff1a;本文中&#xff0c;将使用 “客户端&#xff08;client&am…

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…

Qemu-STM32(十二):STM32F103 框架代码添加

简介 本系列博客主要描述了STMF103的qemu模拟器实现&#xff0c;进行该项目的原因有两点: 作者在高铁上&#xff0c;想在STM32F103上验证一个软件框架时&#xff0c;如果此时掏出开发板&#xff0c;然后接一堆的线&#xff0c;旁边的人估计会投来异样的目光&#xff0c;特别是…

英伟达与通用汽车深化合作,澳特证券am broker助力科技投资

在近期的GTC大会上&#xff0c;英伟达CEO黄仁勋宣布英伟达将与通用汽车深化合作&#xff0c;共同推进AI技术在自动驾驶和智能工厂的应用。此次合作标志着自动驾驶汽车时代的加速到来&#xff0c;同时也展示了英伟达在AI技术领域的最新进展。      合作内容包括&#xff1a;…

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中&#xff0c;我们经常使用 Markdown 来记录表格数据。然而&#xff0c;Markdown 格式的表格在实际应用中不如 Excel 方便&#xff0c;特别是需要进一步处理数据时。因此&#xff0c;我们开发了一个使用 wxPython 的 GUI 工具&#xff0c;将 Markdown…

HarmonyOS NEXT 关于鸿蒙的一多开发(一次开发,多端部署) 1+8+N

官方定义 定义&#xff1a;一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署。 目标&#xff1a;支撑开发者快速高效的开发支持多种终端设备形态的应用&#xff0c;实现对不同设备兼容的同时&#xff0c;提供跨设备的流转、迁移和协同的分布式体验。 什么是18…

Nacos

简介 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台&#xff0c;旨在为微服务架构提供高可用、高性能的解决方案。其核心功能包括服务注册与发现、动态配置管理、服务健康监测、动态 DNS …

Win11系统下qq远程不能控制对方电脑(鼠标点不动)的解决方法

在被控制的电脑上&#xff0c;打开控制面板&#xff0c;点击系统和安全 点击更改用户账户控制设置 下拉用户控制设置至最低&#xff0c;从不通知&#xff0c;点击确定 返回控制面板系统与安全&#xff0c;带年纪允许远程访问 点击允许远程协助连接这台计算机 重启电脑 再次打…

猎豹移动营收连续三季增长,AI驱动的猎豹成绩单怎么分析?

3月26日&#xff0c;猎豹移动发布2024年Q4及全年财报&#xff0c;这份财报我们到底该该怎么分析呢&#xff1f; 首先&#xff0c;整体财务表现稳健&#xff0c;营收连续三季增长。从财务数据来看&#xff0c;猎豹移动整体表现稳健。2024年Q4及全年财报显示&#xff0c;总收入达…

函数:链式访问

链式访问是将函数的返回值当作回传值就是链式访问 这是原本的字符数回传代码 int main() {int len strlen("seig heil");printf("%d", len);return 0; } 运行结果&#xff1a; 这是链式访问的代码&#xff1a; int main() {printf("%d\n",s…

C++ map容器总结

map基本概念 简介&#xff1a; map中所有元素都是pair pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09; 所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap属于关…