模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题)

news2024/12/26 22:02:59

难度适中,动态规划出现的比例还是比较高的,要好好掌握,二分查找的点也是比较灵活的。(A卷和B卷第一道题是一样的)

题目一:讨厌鬼的组合帖子

思路:这个题算是一个还不错的题;

本质就是:一个数组元素选或不选,可以达到的最大绝对值,经典动态规划入门题了,重要的就是能不能看到这个本质。

import java.util.Scanner;

public class taoTanGui {
    public static void main(String[] args) {
        // 创建 Scanner 对象用于读取输入
        Scanner sc = new Scanner(System.in);

        // 读取整数 n
        int n = sc.nextInt();

        // 创建长度为 n 的数组 a, b, c
        long[] a = new long[n];
        long[] b = new long[n];
        long[] c = new long[n];

        // 读取数组 a 的值
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextLong();
        }

        // 读取数组 b 的值并计算 c[i] = a[i] - b[i]
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextLong();
            c[i] = a[i] - b[i];
        }

        // 创建二维 dp 数组,dp[i][0] 和 dp[i][1] 分别表示状态 i 的最小值和最大值
        // i 表示 选1个,选2个,选3 个,选 4个
        long[][] dp = new long[n + 1][2];

        // 初始化 dp 数组中的所有元素为 0
        // dp[0][0] = 0;
        // dp[0][1] = 0;


        // 计算 dp 数组
        for (int i = 0; i < n; i++) {
            // 选中当前元素的情况
            dp[i + 1][0] = Math.min(dp[i][0], dp[i][1]) + c[i];
            dp[i + 1][1] = Math.max(dp[i][0], dp[i][1]) + c[i];

            // 不选当前元素的情况
            dp[i + 1][0] = Math.min(dp[i][0], dp[i + 1][0]);
            dp[i + 1][1] = Math.max(dp[i][1], dp[i + 1][1]);
        }

        // 计算最终结果(Math.abs()是取绝对值的api)
        long ans = Math.max(Math.abs(dp[n][0]), Math.abs(dp[n][1]));

        // 输出结果
        System.out.println(ans);

        // 关闭 Scanner 对象
        sc.close();
    }
}

题目二:小红的16版方案

思路和代码

看到这种题,要有一个思想:二分查找,折半搜索最大的符合条件的版本号;

如何判断当前版本是否符合条件,可以使用 差分数组,其可以看错前缀和的逆过程,一定要掌握!

这段代码使用二分查找的思想,结合差分数组和前缀和的技巧来解决一个区间操作的最大化问题。通过逐步尝试更多的查询,找出能够满足条件的最大查询数量。

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 读取 n 和 m,n 表示数组 a 的长度,m 表示查询的数量
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        // 初始化数组 a,用于存储 n 个元素
        long[] a = new long[n + 1];
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextLong(); // 读取数组 a 的值
        }

        // 创建二维数组 arr,用于存储 m 个查询,每个查询包含左右边界 l 和 r
        List<int[]> arr = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            int l = sc.nextInt();
            int r = sc.nextInt();
            arr.add(new int[] { l, r }); // 将每个查询的 [l, r] 存入列表
        }

        // 初始化左右边界 l 和 r,用于二分查找的范围
        int l = 1;
        int r = m;

        // 二分查找,寻找最大的满足条件的 mid
        while (l <= r) {
            int mid = (l + r) / 2; // 计算中间值

            // 创建数组 A,长度为 n + 2 用于差分数组的计算
            int[] A = new int[n + 2];
            
            // 根据当前 mid 值,应用前 mid 个查询,计算差分数组 A
            for (int i = 0; i < mid; i++) {
                int[] query = arr.get(i);
                int aStart = query[0];
                int aEnd = query[1];
                A[aStart] += 1;
                A[aEnd + 1] -= 1;
            }

            // 使用标志位 ok 来判断当前差分结果是否满足条件
            boolean ok = true;
            
            // 计算实际数组 A 中的每个值,判断是否超过数组 a 中对应位置的值
            for (int i = 1; i <= n && ok; i++) {
                A[i] += A[i - 1]; // 计算前缀和
                if (A[i] > a[i]) {
                    ok = false; // 如果差分数组的值大于原数组 a 的值,则不满足条件
                }
            }

            // 根据 ok 的结果调整二分查找的上下界
            if (ok) {
                l = mid + 1; // 如果条件满足,增加下界 l
            } else {
                r = mid - 1; // 如果不满足条件,减小上界 r
            }
        }

        // 输出结果,l - 1 是最大的满足条件的 mid
        System.out.println(l - 1);
        
        sc.close(); // 关闭 Scanner
    }
}
  1. 读取输入:

    • int n = sc.nextInt();int m = sc.nextInt();:分别读取整数 nm,表示数组的大小和查询的数量。
    • long[] a = new long[n + 1];:创建一个大小为 n+1 的数组 a,索引从 1 开始存储。
    • for (int i = 1; i <= n; i++) a[i] = sc.nextLong();:从控制台读取数组 a 的值。
  2. 读取查询区间:

    • List<int[]> arr = new ArrayList<>();:创建一个列表 arr 用于存储查询的左右区间 [l, r]
    • for (int i = 0; i < m; i++) { ... }:循环读取 m 个查询的左右边界 lr,并将它们以数组的形式存入 arr 列表。
  3. 初始化二分查找的上下界:

    • int l = 1; int r = m;:初始化左右边界 lr 用于二分查找。
  4. 二分查找:

    • while (l <= r) { ... }:进入二分查找循环,循环条件是 l <= r
    • int mid = (l + r) / 2;:计算当前二分查找的中间值 mid
    • int[] A = new int[n + 2];:创建一个差分数组 A,用于计算前缀和。
  5. 差分数组的应用:

    • for (int i = 0; i < mid; i++) { ... }:遍历前 mid 个查询,使用差分方法对数组 A 进行标记。
    • A[aStart] += 1; A[aEnd + 1] -= 1;:标记差分数组的起始和结束位置。
  6. 前缀和计算与条件检查:

    • for (int i = 1; i <= n && ok; i++) { ... }:遍历数组 A,计算前缀和并检查是否超过数组 a 中的值。
    • if (A[i] > a[i]) ok = false;:如果差分数组的值大于原数组 a 中对应位置的值,则不满足条件。
  7. 更新二分查找的上下界:

    • if (ok) l = mid + 1;:如果当前中间值 mid 对应的查询符合条件,则增加下界。
    • else r = mid - 1;:否则减小上界。
  8. 输出结果:

  • System.out.println(l - 1);:最后输出 l - 1,即最大能满足条件的查询个数。

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

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

相关文章

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…

Java导出分类到Excel

需求 在一般需求中点击导出按钮可以把所有的分类导出到Excel文件中。 技术方案 使用EasyExcel实现Excel的导出操作。 https://github.com/alibaba/easyexcel https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81…

【计算机方向】三本中科院SCI宝刊,国人占比高,发文友好,门槛低,毕业靠它了!

本期将为您带来五本计算机SCI 妥妥毕业神刊&#xff01; ARTIFICIAL INTELLIGENCE REVIEW AUTONOMOUS ROBOTS Cognitive Computation 期刊名称&#xff1a;ARTIFICIAL INTELLIGENCE REVIEW 期刊简介&#xff1a; 发布对该领域的应用、技术和算法的批判性评估。 为研究人员…

HDU1159——通用子序列,HDU1160——FatMouse的速度、HDU1165——艾迪的研究 II

HDU1159——通用子序列 题目描述 问题 - 1159 (hdu.edu.cn) 问题描述 给定序列的子序列是给定的序列&#xff0c;其中遗漏了一些元素&#xff08;可能没有&#xff09;。给定一个序列 X <x1&#xff0c; x2&#xff0c; ...&#xff0c; xm>如果存在一个严格递增的 X …

【C++ Primer Plus习题】2.7

问题: 解答: #include <iostream> using namespace std;void print(int hour, int minute) {cout << "Time:" << hour << ":" << minute << endl; }int main() {int hour0;int minute 0;cout << "请输入…

NumExpr加速计算(numpy表达式)

文章目录 一、简介二、安装三、函数详解四、性能评估 Python 性能优化&#xff1a;NumExpr Numba CuPy 一、简介 numexpr&#xff08;全称&#xff1a;numpy expression&#xff09;&#xff1a;用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。 优势&#xff1…

软考高级科目怎么选?

首先上图 从图片中可以看出来&#xff0c;在软件开发中考试方向为程序员-软件设计师-系统架构师或者系统分析师。 系统分析师与系统架构师工作内容&#xff1a; 系统分析师&#xff1a;在信息系统项目开发过程中负责制定信息系统需求规格说明书和项目开发计划、指导和协调信息…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

Linux系统编程全面学习

应用层&#xff1a;写一个QT可执行程序、一个C程序 驱动层&#xff1a;写一个LED、蜂鸣器、pwm驱动 硬件层&#xff1a;焊接、layout Linux系统介于应用层和驱动层之间&#xff0c;Linux系统会向应用层提供接口&#xff0c;学习使用的基本是Linux内核向用户提供的接口或者可以…

理解Tomcat的IP绑定与访问控制

在使用Spring Boot开发应用时&#xff0c;内置的Tomcat容器提供了灵活的网络配置选项。特别是&#xff0c;当计算机上有多个网卡时&#xff0c;如何配置server.address属性显得尤为重要。本文将详细探讨不同IP配置对Tomcat服务访问的影响。 多网卡环境下的IP配置 假设你的计算…

java 8种基础数据类型

1、数据范围 2、各个类型转换 实线转换&#xff1a;无信息丢失的自动转换&#xff0c;反方向需要强制类型转换&#xff0c;如&#xff08;int) 虚线转换&#xff1a;可能存在精度丢失 精度丢失示例如下&#xff1a; long l 123456787654321L; float f l; System.out.prin…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架&#xff1a;Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言&#xff08;QVD-2022-46174&#xff09;介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

太上老君的“三味真火”也可以提升3D NAND可靠性!

《西游记》中孙悟空因在太上老君的炼丹炉中历经九九八十一难&#xff0c;最终炼就了一双能够洞察一切妖魔鬼怪真身的“火眼金睛”。这双神奇的眼睛&#xff0c;仿佛预示着一种古老的智慧——通过火的考验&#xff0c;可以淬炼出更加坚韧的灵魂。 而在现代科技的洪流中&#xff…

软件测试-自动化测试

自动化测试 测试人员编写自动化测试脚本&#xff0c;维护并解决自动化脚本问题 自动化的主要目的就是用来进行回归测试 回归测试 常见面试题 ⾃动化测试能够取代人工测试吗&#xff1f; ⾃动化测试不⼀定⽐人工测试更能保障系统的可靠性&#xff0c;⾃动化测试是测试⼈员手…

vue2项目从0到1记录

脚手架需要安装完 npm install -g vue/cli1. 使用脚手架创建项目 vue create 项目名2. 引入样式重置normalize.css插件 // 统一浏览器样式 安装&#xff1a;npm install --save normalize.css 引入&#xff1a;import normalize.css/normalize.css3. 根据部署环境判断是否要…

MyBatis[进阶]

大纲: 动态SQL查询 留言板 1. 动态SQL 1.1 <if> 我们都注册过一些信息,有的信息是非必填项,改如何实现呢? 这个时候就需要使⽤动态标签来判断了 ⽐如添加的时候性别gender为⾮必填字段&#xff0c;具体实现如 下&#xff1a; 注解: 如果性别为空: 如果性别不为空:…

你真的会用大模型吗,探索提示词工程的魅力

相信在这一两年内&#xff0c;每个人都尝试使用了各种大模型。不知大家有没有发现&#xff0c;它们的质量参差不齐&#xff0c;回答的内容也不一定准确。随着人工智能技术的快速发展&#xff0c;越来越多的模型被开发出来并用于各种应用&#xff0c;但并非所有模型都能够提供可…

Leetcode每日刷题之904.水果成篮

1.题目解析 本题的题目要求较长&#xff0c;不过理解起来较为简单&#xff0c;就是在给定数组内找出最长子数组&#xff0c;并且该最长子数组只能有两种数字&#xff0c;最后返回该符合条件的最长子数组的长度即可 题目来源&#xff1a;904.水果成篮 2.算法原理 本题的核心是找…

组件提前渲染

问题&#xff1a; 组件正常引入并使用的过程中&#xff0c;出现组件第一次渲染不显示&#xff0c;只有再次刷新页面才显示的问题 <el-table-column label"图纸规定" align"center" prop"tzgd" v-if"mbform.zbzd.tzgd" width"…

动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本

系统流程概览 main函数 对于一个服务器程序来说&#xff0c;因为要为外部的客户端程序提供网络服务&#xff0c;也就是进行数据的读写&#xff0c;这就必然需要一个 socket 文件描述符&#xff0c;只有拥有了文件描述符 C/S 两端才能通过 socket 套接字进行网络通信&#xff0…