2024年3月31日微众银行春招实习试题-题目+题解+在线评测【3题 模拟 二分 动态规划】

2024年3月31日微众银行春招实习试题-题目+题解+在线评测【3题 模拟 二分 动态规划】

  • 题目一描述:
    • 输入格式
    • 输出格式
    • 样例输入
    • 样例输出
    • 评测数据与规模
    • 解题思路一:模拟,切片操作
    • 解题思路二:for循环
  • 题目二描述:
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 评测数据与规模
    • 解题思路一:二分查找,小于当前预算的城市的旅行花费bisect.bisect_right(costs, v)
    • 解题思路一:手撕二分查找
  • 题目三描述:
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 评测数据与规模
    • 解题思路一:

题号题目提交网址难度(对标leetcode)核心做法
01魔法迷宫简单模拟
02塔子哥的春季旅行计划中等二分
03塔子哥的魔法宝石中等动态规划

题目一描述:

塔子哥在玩一款魔法迷宫游戏。迷宫由一个 3×3 的网格组成,每个格子中有一个魔法物品。塔子哥每次可以选择一行或一列,并将其向左、右、上、下滑动一格。滑出边界的物品会从另一端出现。例如,如果将第一行 123 向左滑动一格,它将变成 231。

游戏开始时,魔法物品的初始状态如下:

1 2 3
4 5 6
7 8 9

塔子哥想知道,经过若干次操作后,迷宫中魔法物品的排列会变成什么样。

输入格式

第一行包含一个正整数 n,表示操作的数量。

第二行包含 n 个正整数,其中第 i 个数表示第 i 次操作:

  • 如果操作为 1、2、3,分别表示将第 1、2、3 行向右滑动一格。
  • 如果操作为 4、5、6,分别表示将第 1、2、3 列向上滑动一格。

输出格式

输出 3 行,每行 3 个数,表示经过所有操作后迷宫的状态。

样例输入

2
1 5

样例输出

3 5 2
4 8 6
7 1 9

评测数据与规模

1≤n≤500001, 1≤op≤61 。

解题思路一:模拟,切片操作

按题意模拟即可,使用一个二维数组来表示迷宫的状态,然后根据输入的操作依次对数组进行修改。

对于向右滑动一行的操作,先保存该行最右边的元素,然后从右到左依次将每个元素替换为其左边的元素,最后将最左边的元素替换为之前保存的最右边的元素。

对于向上滑动一列的操作,先保存该列最上面的元素,然后从上到下依次将每个元素替换为其下面的元素,最后将最下面的元素替换为之前保存的最上面的元素。

n = int(input())
ops = list(map(int, input().split()))
matrix = [[1,2,3], [4,5,6], [7,8,9]]for op in ops:if op <=3:row = matrix[op - 1]tmp = row[-1]row[-2:] = row[:2]row[0] = tmpmatrix[op-1] = rowelse:tmp = matrix[0][op-4]for j in range(1, 3):matrix[j-1][op-4] = matrix[j][op-4]matrix[2][op-4] = tmpfor row in matrix:for item in row:print(item, end = ' ')print()

时间复杂度:O(n)
空间复杂度:O(1)

解题思路二:for循环

n = int(input())
matx = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
a = list(map(int, input().split()))
for op in a:if op <= 3:t = matx[op - 1][2]for j in range(2, 0, -1):matx[op - 1][j] = matx[op - 1][j - 1]matx[op - 1][0] = telse:t = matx[0][op - 4]for j in range(2):matx[j][op - 4] = matx[j + 1][op - 4]matx[2][op - 4] = tfor row in matx:for elem in row:print(elem, end=" ")print()

时间复杂度:O(n)
空间复杂度:O(1)

题目二描述:

春天到了,塔子哥计划去 n 个不同的城市旅行。每个城市都有各自的旅行花费,分别为 x1,x2,⋯ ,xn。塔子哥列出了 m 个预算方案,其中第 i 个方案的预算为 vi。现在,塔子哥想知道对于每个预算方案,他可以选择多少个不同的城市进行旅行。

输入格式

第一行包含一个正整数 n,表示城市的数量。

第二行包含 n 个正整数 x1,x2,⋯ ,xn,表示每个城市的旅行花费。

第三行包含一个正整数 m,表示预算方案的数量。

接下来 m 行,每行包含一个正整数 vi,表示第 i 个预算方案的预算金额。

输出格式

输出共 m 行,每行一个整数,表示对于每个预算方案,塔子哥可以选择的不同城市数量。

样例输入

5
3 10 8 6 11
4
1
10
3
11

样例输出

0
4
1
5

评测数据与规模

1≤n,m≤105 1 ≤ x i , v i ≤ 1 0 9 1 \leq x_i, v_i \leq 10^9 1xi,vi109

解题思路一:二分查找,小于当前预算的城市的旅行花费bisect.bisect_right(costs, v)

抽象完题意可以发现每组询问就是求数组 costs 中有多少个比 v 小的数。

这边只需要对 costs 数组排序后二分判断即可。

import bisect
n = int(input())
costs = list(map(int, input().split()))
costs.sort()
m = int(input())
for i in range(m):v = int(input())idx = bisect.bisect_right(costs, v)print(idx)# 同意
#include<bits/stdc++.h>using namespace std;#define int long longsigned main (){ios::sync_with_stdio(false);std::cin.tie(0);int n; cin >> n;vector<int> a(n);for(int i = 0; i < n; i ++) cin >> a[i];sort(a.begin(), a.end());int m; cin >> m;for(int i = 0; i < m; i ++){int v; cin >> v;int idx = upper_bound(a.begin(), a.end(), v) - a.begin();cout << idx << "\n";}return 0;
}

时间复杂度:O(mlogn)
空间复杂度:O(1)

解题思路一:手撕二分查找

import bisect
n = int(input())
costs = list(map(int, input().split()))
costs.sort()
m = int(input())# lower_bound 返回最小的满足 nums[i] >= target 的 i
# 如果数组为空,或者所有数都 < target,则返回 len(nums)
# 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]# 闭区间写法
def lower_bound(nums, target) -> int:left, right = 0, len(nums) - 1  # 闭区间 [left, right]while left <= right:  # 区间不为空# 循环不变量:# nums[left-1] < target# nums[right+1] >= targetmid = (left + right) // 2if nums[mid] < target:left = mid + 1  # 范围缩小到 [mid+1, right]else:right = mid - 1  # 范围缩小到 [left, mid-1]return left  # 或者 right+1# 左闭右开区间写法
def lower_bound2(nums, target) -> int:left = 0right = len(nums)  # 左闭右开区间 [left, right)while left < right:  # 区间不为空# 循环不变量:# nums[left-1] < target# nums[right] >= targetmid = (left + right) // 2if nums[mid] < target:left = mid + 1  # 范围缩小到 [mid+1, right)else:right = mid  # 范围缩小到 [left, mid)return left  # 或者 right# 开区间写法
def lower_bound3(nums, target) -> int:left, right = -1, len(nums)  # 开区间 (left, right)while left + 1 < right:  # 区间不为空mid = (left + right) // 2# 循环不变量:# nums[left] < target# nums[right] >= targetif nums[mid] < target:left = mid  # 范围缩小到 (mid, right)else:right = mid  # 范围缩小到 (left, mid)return right  # 或者 left+1for i in range(m):v = int(input())idx = lower_bound(costs, v+1)print(idx)

时间复杂度:O(mlogn)
空间复杂度:O(1)

题目三描述:

塔子哥和他的好朋友在玩一个魔法宝石的游戏。游戏开始时,有一颗魔法宝石,其能量值为 x。每回合,塔子哥可以给宝石注入能量值在[a, b] 之间的能量,而他的朋友可以注入能量值在 [c, d] 之间的能量。当宝石的能量值大于等于 s 时,游戏结束,最后一个操作宝石的人将获得胜利。

游戏中,塔子哥总是先手。双方都采取最优策略,你的任务是判断对于给定的初始能量值 x 和获胜能量值 s,谁能够获得最后的胜利。

输入格式

第一行包含一个正整数 T,表示询问的组数。

接下来 T 行,每行包含六个正整数 x,s,a,b,c,d,表示初始能量值、获胜能量值以及双方每回合能够注入的能量值范围。每个数字之间用一个空格隔开。

输出格式

对于每组询问,如果塔子哥获胜,输出 1,否则输出 2。每个答案占一行。

样例输入

3
1 10 1 1 2 2
1 4 1 2 1 2
1 2 1 3 1 3

样例输出

2
2
1

评测数据与规模

1≤T≤100 ,1≤x≤s≤1000 ,1≤a≤b≤100 ,1≤c≤d≤100 。

解题思路一:

在笔试中为数不多的博弈论的题,一般碰到这种类型的题一般有以下三种解法:

  1. 猜结论
  2. 动态规划
  3. 求 sg 函数

由于这题数据范围比较小,我们直接 DP 即可。

定义 dfs(x, f),表示当前宝石的能量值为 x,当前操作者是 f(塔子哥为 True,朋友为 False),返回在双方都采取最优策略的情况下,当前操作者是否能获胜。

  • 如果当前操作者是塔子哥,那么他会尝试给宝石注入 a 到 b 之间的能量。如果注入后能量值大于等于 s,那么塔子哥直接获胜

否则,对于塔子哥注入的每一个可能的能量值,继续往下递归,如果有一种情况下朋友无法获胜,那么塔子哥获胜。

  • 如果当前操作者是朋友,则同理,只是注入的能量值范围变成了 c 到 d。
def dfs(x, f):if dp[x][f] != -1:return dp[x][f]if f:if x + b >= s:dp[x][f] = 1return 1for i in range(a, b + 1):if dfs(x + i, not f):dp[x][f] = 1return 1dp[x][f] = 0return 0else:if x + d >= s:dp[x][f] = 0return 0for i in range(c, d + 1):if not dfs(x + i, not f):dp[x][f] = 0return 0dp[x][f] = 1return 1t = int(input())
for _ in range(t):x, s, a, b, c, d = map(int, input().split())dp = [[-1] * 2 for _ in range(1005)]ok = dfs(x, True)print(1 if ok else 2)

时间复杂度:O(n2)
空间复杂度:O(n)

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

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

相关文章

数字乡村创新实践探索农业现代化路径:科技赋能农业产业升级、提升乡村治理效能与农民幸福感

随着信息技术的快速发展和数字化时代的到来&#xff0c;数字乡村建设正成为推动农业现代化、提升农业产业竞争力、优化乡村治理以及提高农民幸福感的重要途径。本文将围绕数字乡村创新实践&#xff0c;探讨其在农业现代化路径中的积极作用&#xff0c;以及如何通过科技赋能实现…

28. 找出字符串中第一个匹配项的下标(KMP)

class Solution {public int[] getNext(int[] next,String s){//j有两层含义&#xff1a;&#xff08;1&#xff09;最长公共前后缀的长度&#xff08;2&#xff09;前缀的末尾&#xff0c;是即将匹配的那个位置int j 0;//i含义&#xff1a;后缀的末尾&#xff0c;是即将匹配的…

Python疑难杂症(20)---介绍Python的pandas模块中将数据导入内存和导出数据的方法,以及一些参数的用法。

Python的pandas模块中数据框这种数据类型&#xff0c;可以通过文件导入函数&#xff0c;将磁盘上的csv、execl等类型的文件装入内存&#xff0c;并生成数据框的格式&#xff0c;以方便后续使用pandas的专有方法进行处理。 6、DataFrame数据输导入导出方法 Pandas常用的读取数…

26 进程通信

是什么 两个或者多个进程实现数据层面的交互&#xff0c;因为进程独立性的存在&#xff0c;导致通信的成本比较高 目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源 通知事件&#xff1a;一个进程需要向另…

安装ps提示MSVCP140.dll丢失怎么办,推荐几种有效的解决方法

在成功完成Adobe Photoshop&#xff08;简称PS&#xff09;软件的安装过程之后&#xff0c;当用户试图启动并运行该程序时&#xff0c;系统却弹出了一个令人困扰的错误提示信息&#xff0c;明确指出&#xff1a;“无法找到MSVCP140.dll”这一关键文件。这意味着尽管PS软件已经成…

redmibook 14 2020 安装 ubuntu

1. 参考博客 # Ubuntu20.10系统安装 -- 小米redmibook pro14 https://zhuanlan.zhihu.com/p/616543561# ubuntu18.04 wifi 问题 https://blog.csdn.net/u012748494/article/details/105421656/# 笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠 https://blog.csdn.net/…

权威Scrum敏捷开发企业级实训/敏捷开发培训课程

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…

Ps基础学习笔记

Ps基础学习笔记 什么是Ps&#xff1f; Ps&#xff0c;全称Adobe Photoshop&#xff0c;是一款由Adobe公司开发的图像处理软件&#xff0c;广泛应用于图像编辑、图像合成、图像修饰等领域。 Ps的界面介绍 Ps的界面主要分为菜单栏、工具栏、选项栏、面板和工作区组成。菜单栏包含…

赚钱游戏 2.0.2 版

没有c编辑器的可以获取资源来 #include <iostream> #include <string> #include <windows.h> #include <conio.h> #include <fstream> #include <ctime> #include <time.h> #include <stdio.h> #include <cstring> #in…

【机器学习】科学库使用第5篇:Matplotlib,学习目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

【网络设备巡检命令】--思科、华为、H3C、锐捷

【网络设备巡检命令】--思科、华为、H3C、锐捷 一、思科二、华为三、H3C四、锐捷 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、思科 1、查看系统信息&#xff1a; show version2、查看时间&#xff1a; show clock3、查看序列号&a…

Golang教程五(异常处理,泛型,文件操作)

目录 一、异常处理 错误处理与异常区分 Panic 与 Recover 使用原则 二、泛型 泛型函数 泛型结构体 泛型切片 泛型Map 三、文件操作 1.基础io Reader interface Writer interface Seek interface Close interface 文件打开模块 1.文件读取 一次性读取 获取当前…

C++:异常处理

异常处理中对象参数与引用参数的选择 User&#xff1a; catch()中的参数如果使用基类的引用&#xff0c;是不是相当于声明了一个引用&#xff0c;它是基类类型的&#xff0c;catch 到 throw的抛出的对象之后&#xff0c;就相当于这个基类引用指向了抛出的对象&#xff1f; C…

解决FLINK CDC监控oracle报Failed to parse insert DML问题

更多优秀文章,请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、错误展现: Caused by: io.debezium.connector.oracle.logminer.parser.DmlParserException: Failed to parse insert DML: insert into "HIS_DATA". at io.debezium.connector.oracle.logm…

Nginx内存池相关源码剖析(三)小块内存分配逻辑

在Nginx中&#xff0c;小块内存通常指的是那些大小相对较小、分配和释放频率较高的内存块。这些内存块由于数量众多、管理复杂&#xff0c;因此需要使用一种高效的内存管理机制来减少内存管理的开销和内存碎片的产生。 Nginx内存池通过一种预分配和复用的方式来管理小块内存。当…

觉飞、希亦、Daily neaty内衣洗衣机好用吗?爆款产品性能全面测评!

近几年来小家电产品中&#xff0c;内衣洗衣机的讨论热度无疑是最大的&#xff0c;功能多、操作方便&#xff0c;用内衣洗衣机来清洗内衣裤会更加卫生和安全&#xff0c;能满足了消费者的多种需求。不过尽管市面上的内衣洗衣机品牌很多、挑选空间大&#xff0c;也不是所有产品都…

RT-thread-线程间通讯3-事件集

事件集 事件集也是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多,多对多的线程间同步。 一个线程和多个事件的关系可设置为: 其中任意一个事件唤醒 线程,或几个事件都到达后唤醒线程,多个事件集合可以用一个32bit无符号整型变量来表示,…

4.8-4.12算法刷题笔记

刷题 堆1. 堆排序2. 模拟堆 哈希表3. 模拟散列表4. 字符串哈希 DFS5. 排列数字6. n-皇后问题 2. BFS&#xff08;队列&#xff09;7. 字母迷宫8. 滑动谜题 3. 树与图的dfs9. 树的重心 4. 树与图的bfs(最短路)10. 图中点的层次( 无权最短路 ) 5. 拓扑排序11. 课程表 6. 朴素dijk…

人工智能时代的图像识别:机遇与挑战并存

人工智能&#xff08;AI&#xff09;时代为图像识别领域带来了前所未有的机遇&#xff0c;同时也伴随着一系列挑战。这一领域的发展不仅深刻影响了科技、医疗、教育、娱乐等多个行业&#xff0c;还在一定程度上改变了人们的生活方式。 机遇&#xff1a; 技术突破与创新&#…

prometheus.yaml

目录 一、说明1、全局配置 global&#xff1a;2、告警配置 alerting&#xff1a;3、规则文件配置 rule_files&#xff1a;4、拉取配置 scrape_configs&#xff1a;5、远程读写配置 remote_read/remote_write&#xff1a; 二、简单配置示例&#xff1a; 一、说明 prometheus的配…