笔试 | 拼多多 2021届提前批 算法工程师笔试 0901
PDD 2021届提前批 算法工程师笔试
文章首发于公众号“面鲸”,更多大厂笔试面试题解欢迎关注。添加小编微信可获取python题解哦
第一题
题目描述
-
对于一个n阶矩阵,首先用米字形把矩阵等分成8个区域,然后从左上角开始,按逆时针顺序给各自区域编号为1,2,…,8。如图所示
-
同时矩阵元素需要满足
- 各区域内的元素都等于区域的编号
- 被分割线穿过的元素值都等于0
输入描述
- 一个数字n,表示矩阵的阶数(3<n<200)
输出描述
- 输出n行,每行n个数,用空格隔开。表示打印出的矩阵。
样例输入
- 4
样例输出
- 0 2 1 0
- 3 0 0 8
- 4 0 0 7
- 0 5 6 0
解析
- 观察这个“米”字型,能够分为10种情况:8个区域+两条对角线。找每个区域的坐标的特点即可。
第二题
题目描述
- 多多在玩一个叫做《野蛮》的回合策略游戏。在这个游戏中,地图可以视为一个N*M的矩形,划分为N*M个小正方形的格子。一个格子的上、下、左、右四个格子视为与该格子相邻。
- 玩家可以自爱每个格子上布置一个士兵。并且每个士兵可以和相邻的士兵归为同一个队伍。在这个游戏中,同一个队伍的士兵数量越多,就越强大。多多现在有一个道具可以移动任意一个格子上的士兵到任意一个格子中。求移动后可得到的最大队伍士兵数。
输入描述
- 第一行输入两个整数N, M(1<=N, M<=400),分别代表格子的行数和列数
- 接下来有N行,每行有M个数字(以空格隔开),数字为0或1,代表每个格子里的士兵数量。
输出描述
- 输出一行表示一个整数,表示可得到的最大队伍士兵数。
样例输入
- 4 4
- 1 0 1 1
- 1 1 0 1
- 0 0 0 0
- 1 1 1 1
样例输出
- 8
说明
- 一种最优的移动方法
- 1 0 1 1
- 1 1 0 0
- 1 0 0 0
- 1 1 1 1
解析
- 首先可以通过DFS求出每一个队伍中士兵的个数;然后枚举要新放士兵的位置(i, j),判断位置(i, j)放一个士兵后可否将不同的队伍联通。注意考虑边界的情况~
- c++代码:https://paste.ubuntu.com/p/hww9qCxG6C/
- python代码:公众号后台回复“联系”添加小编微信即可获取~
第三题
题目描述
- 在神奇的一天,多多背着一个神奇的背包来到一个神奇的商店,商店里有N个神奇的商品。店长让多多挑任意个商品放入背包带走。多多发现,这些商品中有些会占用一部分空间,但也有些商品反而会让背包变得更大。同时,这些商品中有些具有一定的收益,但也有些商品是负收益。多多想知道它今天能带走的最大收益是多少。
- 对于前60%的数据,商品占用的背包空间和商品收益均为非负整数。
输入描述
- 第一行是两个整数N,M,其中N表示商品的总数,M表示多多的背包原始大小。
- 第二到N+1行每行有两个数字,,其中表示第i件商品占用的背包空间,如果为负数则表示这件商品会增加背包空间;表示第i件商品的收益,如果为负数则表示这件商品是负收益。
输出描述
- 多多能带走的最大收益。
样例输入
- 4 4
- -1 -1
- 1 -1
- -1 1
- 6 6
样例输出
- 6
解析
- 对于前60%的数据,可以直接用01背包。对于后面的数据,在解01背包的时候遇到一个问题是体积有负数,这样在dp的过程中会遇到两个问题:循环的时候超出体积的范围;压缩空间的时候状态转移方程:dp[v]=max(dp[v],dp[v-c[i]]+w[i]),c[i]为负数时v-c[i]>v,这样按一般的循环的方向从大到下会重复计算。
- 先看第二个问题,在一般的01背包压缩空间的时候,体积的遍历是从大到小,因为dp[v]=max(dp[v],dp[v-c[i]]+w[i]),当前的dp[v]只取决于比自己小的dp[v-c[i]],所以从大到小遍历时每次dp[v-c[i]]和dp[v]都是上一次的状态。
- 如果体积为负v-c[i]>v,从大到小遍历dp[v-c[i]]是当前物品的状态,不是上一个,这样就会出错,解决的办法是从小到大遍历。
- 针对第一个问题,在处理的时候将整个数轴平移,使得原来所有可能的情况都为正。
- c++代码:https://paste.ubuntu.com/p/NmY4dqwCG4/
- python代码:公众号后台回复“联系”添加小编微信即可获取~
第四题
题目描述
- 多多君最近在研究新的一组函数:
- 多多君认为,若某个正整数X可以被特征值集合中的某个数Y整除,那么这个正整数X是具有“显著特征”的。
- 对于给定的N和M,其中N表示正整数集合1-N,而M表示有M个特征值组成的集合
- 多多君现在想知道,在正整数集合1-N中,一共有多少具有显著特征的数字。
输入描述
- 第一行,两个正整数N和M,分别表示正整数集合以及特征集的大小(1<=N<=1e9,1<=M<=10)
- 接下来M行,表示特征集合的数字,其中第i行表示第i个特征值
输出描述
- 共1行,表示正整数集合中符合显著特征的数字个数
样例输入
- 10 1
- 2
样例输出
- 5
说明
- 2 4 6 8 10都可以被2整除,共5个
解析
- 容斥原理入门题。注意到M不超过10,可以利用二进制来枚举当前用到了哪些数。
- c++代码: https://paste.ubuntu.com/p/9fssz66yfG/
- python代码:公众号后台回复“联系”添加小编微信即可获取~