当前位置: 首页 > news >正文

华为OD 机试 2025-数字序列比大小

题目描述

A、B 两个人玩一个数字比大小的游戏。在游戏前,两个人会拿到相同长度的两个数字序列,两个数字序列不相同,且其中的数字是随机的。
A、B 各自从数字序列中挑选出一个数字进行大小比较,赢的人得 1 分,输的人扣 1 分,相等则各自的分数不变。用过的数字需要丢弃。求 A 可能赢 B 的最大分数。

  • 输入描述
    输入数据的第一个数字表示数字序列的长度 N,后面紧跟着两个长度为 N 的数字序列。

  • 输出描述
    输出 A 可能赢 B 的最大分数。

  • 补充说明

    1. 假设 A 知道 B 的数字序列,且总是 B 先挑选数字并明示。
    2. 采用贪心策略:能赢的一定要赢,要输的尽量减少损失。
  • 示例

    输入:
    3
    4 8 10
    3 6 4输出:
    3
    

    过程示例:

    • A:4 vs B:3 → +1
    • A:8 vs B:6 → +1
    • A:10 vs B:4 → +1

优化思路解析

  1. 双端指针贪心

    • 对 A、B 两个序列分别从小到大排序。

    • 用两个指针 bLbR 分别指向 B 的最小端和最大端。

    • 遍历 A 中按升序排列的每个元素 a

      • a > B[bL],则对战 B 的最小值,必赢,得 +1 分,bL++

      • 否则,用 a 对战 B 的最大值:

        • a < B[bR],必输,得 –1 分;
        • 否则(相等)平局,得分不变。
      • 操作后,bR--

  2. 正确性

    • 任何能赢的局面都拿下;
    • 无法赢时,用最“小”的代价牺牲最“强”的对手卡,减少后续影响。
  3. 时间复杂度

    • 排序 O(N log N),遍历 O(N),总体 O(N log N),可处理 N ≈ 10⁵。

Python 实现

def max_score(A, B):A.sort()B.sort()bL, bR = 0, len(B) - 1score = 0for a in A:if a > B[bL]:score += 1bL += 1else:if a < B[bR]:score -= 1bR -= 1return scoreif __name__ == "__main__":import sysdata = list(map(int, sys.stdin.read().split()))N = data[0]A = data[1:1+N]B = data[1+N:1+2*N]print(max_score(A, B))

Java 实现

import java.util.*;public class Main {public static int maxScore(int[] A, int[] B) {Arrays.sort(A);Arrays.sort(B);int bL = 0, bR = B.length - 1, score = 0;for (int a : A) {if (a > B[bL]) {score++;bL++;} else {if (a < B[bR]) {score--;}bR--;}}return score;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int[] A = new int[N], B = new int[N];for (int i = 0; i < N; i++) {A[i] = sc.nextInt();}for (int i = 0; i < N; i++) {B[i] = sc.nextInt();}System.out.println(maxScore(A, B));sc.close();}
}

JavaScript 实现

function maxScore(A, B) {A.sort((a, b) => a - b);B.sort((a, b) => a - b);let bL = 0, bR = B.length - 1, score = 0;for (const a of A) {if (a > B[bL]) {score++;bL++;} else {if (a < B[bR]) {score--;}bR--;}}return score;
}// Node.js 读取输入并运行
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const nums = [];
rl.on('line', line => {nums.push(...line.trim().split(/\s+/).map(Number));if (nums.length >= nums[0] * 2 + 1) {const N = nums[0];const A = nums.slice(1, 1 + N);const B = nums.slice(1 + N, 1 + 2 * N);console.log(maxScore(A, B));rl.close();}
});

在这里插入图片描述

http://www.lqws.cn/news/489691.html

相关文章:

  • 麒麟系统上设置Firefox自动化测试环境:指定Marionette端口号
  • vue | vue-macros 插件升级以及配置
  • 拼多多API限流机制破解:分布式IP池搭建与流量伪装方案
  • Elasticsearch API访问权限控制:禁用外部端点访问
  • 家电 EPS 内衬,重庆制造如何保障家电安全?​
  • Android的TabLayout对象添加select监听器,使得和mViewPage联动
  • JavaScript防抖与节流:优化高频事件处理
  • minidocx: 一个轻量级的跨平台的C++操作word的开源库
  • Python----OpenCV(图像増强——图像平滑、均值滤波、高斯滤波、中值滤波、双边滤波)
  • ScopedValue vs ThreadLocal:谁更适合微服务上下文管理
  • PyTorch 张量(Tensors)全面指南:从基础到实战
  • WebSocket长连接在小程序中的实践:消息推送与断线重连机制设计
  • 全链接神经网络,CNN,RNN各自擅长解决什么问题
  • qt常用控件--02
  • uniapp+vue3做小程序,获取容器高度
  • 相机标定与3D重建技术通俗讲解
  • <tauri><threejs><rust><GUI>基于tauri和threejs,实现一个3D图形浏览程序
  • UE5 AnimMontage 的混合(Blend)模式
  • npm install时,遇到digital envelope routines::unsupported
  • BlazorWebView微软跨平台浏览器控件,UI组件
  • .NET多线程任务实现的几种方法及线程等待全面分析
  • Redis Stream 消息队列详解及 PHP 实现
  • 认识鸿蒙之了解应用结构
  • 关于华为Pura70Pro+升级鸿蒙NEXT和回退
  • 【Oracle篇】Windows平台单进程多线程架构设计与实现(比对Linux多进程架构)
  • 【Linux篇章】线程同步与互斥2:打破多线程并发困境,开启高效程序运行新境界
  • Gartner《Generative AI Use - Case Comparison for Legal Departments》
  • 【机器学习1】线性回归与逻辑回归
  • AI大模型之机器学习理论及实践:监督学习-机器学习的核心基石
  • 跟着AI学习C#之项目实践Day3