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

难度适中,动态规划出现的比例还是比较高的,要好好掌握,二分查找的点也是比较灵活的。(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,即最大能满足条件的查询个数。

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

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

相关文章

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

【图文并茂】ant design pro 如何优雅地把删除和批量删除功能合并到一起,并抽出来成为组件

如上图所示&#xff0c;其实批量删除和删除应该算是一个功能 只是删除一个或多个的区别 那么接口应该用的同一个 删除一个的时候呢&#xff0c;就传 一个对象_id 过去 删除多个的时候&#xff0c;就传 多个 对象 _id 的数组过去 后端 const deleteMultipleRoles handleAs…

软件测试-测试分类

测试分类 按照测试目标测试 界面测试 页面内展示的所有内容/元素都需要测试 参考UI图找不同 功能测试 ​ 如何设计功能测试用例&#xff1f; 参考产品规格说明书进行用例的编写&#xff0c;具体的测试用例需要使用黑盒设计测 试用例的方法&#xff0c;如等价类、边界值、…

嵌入式学习——(Linux高级编程——线程控制)

线程的互斥 一、互斥的重要性 在多线程编程中&#xff0c;互斥机制至关重要。当多个线程同时访问临界资源时&#xff0c;如果没有有效的互斥控制&#xff0c;可能会导致数据不一致、资源竞争等问题。通过互斥锁&#xff0c;可以确保在任何时刻只有一个线程能够访问临界资源&am…

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

python构建一个web程序

from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return 欢迎来到我的Python Web程序!if __name__ __main__:app.run(debugTrue)1、安装flask D:\Users\USER\PycharmProjects\pythonProject1\p01>pip install flask WARNING: Ignoring invalid…

多线程中常见问题

1、为什么不建议使用Executors来创建线程池&#xff1f; 除开有可能造成的OOM外&#xff0c;使用Executors来创建线程池也不能自定义线程的名字&#xff0c;不利于排查问题&#xff0c;所以建议是直接使用ThreadPoolExecutor来定义线程池&#xff0c;这样可以灵活控制 2、线程…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…

线程优先级调度

Windows优先级调度算法 系统维护了一个全局的处理器数组KiProcessorBlock&#xff0c;其中每个元素对应于一个处理器的KPRCB对象。其次&#xff0c;另有一个全局变量KiIdleSummary记录了哪些处理器当前是空闲的。所谓一个处理器是空闲的&#xff0c;是指该处理器正在执行空闲循…

根据状态的不同,显示不同的背景颜色

文章目录 前言HTML模板部分JavaScript部分注意&#xff1a;主要差异影响如何处理示例 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 实现效果&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 根据给定的状态…

内网安全:跨域攻击

目录 获取域信息 利用域信任密钥获取目标域 利用krbtgt哈希值获取目标域 内网中的域林&#xff1a; 很多大型企业都拥有自己的内网&#xff0c;一般通过域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以 主域和子域进行区分&#xff0c;以方便统一管理。在…

基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的图像质量评估功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的图像质量评估模块…

大模型学习笔记 - LLM 之 attention 优化

LLM 注意力机制 LLM 注意力机制 1. 注意力机制类型概述2.Group Query Attention3.FlashAttention4. PageAttention 1. 注意力机制类型概述 注意力机制最早来源于Transformer&#xff0c;Transformer中的注意力机制分为2种 Encoder中的 全量注意力机制和 Decoder中的带mask的…

qt处理表格,Qtxlsx库文件的安装以及导入

qt想要处理excel表格的&#xff0c;这个过程中避免不了使用Qtxlsx这个库文件。这几天花了几天时间&#xff0c;终于本地调通了。记录一下。 关于Qtxlsx的使用&#xff0c;大致分为2中方法。 方法一&#xff1a;直接下载对应的xlsx文件&#xff0c;然后在.pro文件中 这种方法是…

《黑神话.悟空》:一场跨越神话与现实的深度探索

《黑神话.悟空》&#xff1a;一场跨越神话与现实的深度探索 在国产游戏日益崛起的今天&#xff0c;《黑神话.悟空》以其独特的剧情、丰富的人物设定和深刻的主题&#xff0c;成为了无数玩家翘首以盼的国产3A大作。这款游戏不仅是一次对传统故事的创新演绎&#xff0c;更是一场对…

《黑神话:悟空》游戏攻略:第一回合打法教程!

《黑神话&#xff1a;悟空》是一款以西游记为背景的动作角色扮演游戏&#xff0c;玩家在游戏中将面对各式各样的强大敌人和BOSS。在游戏的第一回合中&#xff0c;你将遇到牯护院、灵虚子、幽魂等多个BOSS。以下是详细的BOSS打法攻略&#xff0c;帮助你在战斗中游刃有余。你可以…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理&#xff1a;&#xff08;思科四个都是广播包&#xff09; 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

路径规划 | 灰狼算法+B样条曲线优化无人机三维路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 灰狼算法B样条曲线优化无人机三维路径规划&#xff08;Matlab&#xff09; 群智能路径规划算法。三维灰狼算法&#xff08;GWO&#xff09;加B样条曲线优化的matlab代码。无人机&#xff08;UAV&#xff09;路径规划…

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

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

入门redis

一、安装redis-py库 打开pycharm 在终端中输入 pip install redis 二、连接到redis服务器 import redis r redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue)host是 Redis 服务器的主机名或 IP 地址&#xff0c;port是端口号&#xff0c;db是要使用的数据库编…