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

2024-08-23 00:28

本文主要是介绍模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

import java.util.Scanner;public class taoTanGui {public static void main(String[] args) {// 创建 Scanner 对象用于读取输入Scanner sc = new Scanner(System.in);// 读取整数 nint n = sc.nextInt();// 创建长度为 n 的数组 a, b, clong[] 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 和 rList<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;// 二分查找,寻找最大的满足条件的 midwhile (l <= r) {int mid = (l + r) / 2; // 计算中间值// 创建数组 A,长度为 n + 2 用于差分数组的计算int[] A = new int[n + 2];// 根据当前 mid 值,应用前 mid 个查询,计算差分数组 Afor (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 是最大的满足条件的 midSystem.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,即最大能满足条件的查询个数。

这篇关于模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097832

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述