阿里灵犀互娱 秋招 2023.08.20 机试题目与题解
1、prime
给到一个字符串(由a-z
组成),统计每个字符出现的次数,判断出现次数最多的字符的出现此时是否为质数。
输入
第一行为一个整数\(n\),表示有多少个字符串。
然后是\(n\)行,表示需要求解的字符串,字符串长度大于\(1\)小于\(10000\)。
输出
出现次数最多的字符的出现次数为质数输出YES,否则输出NO
样例
1 | 输入: |
解答
直接暴力枚举字符串出现的次数,统计出最大次数\(c\)后,暴力判断\(c\)是否为质数即可。
代码
1 |
|
2、rank
小明想在游戏比赛中获得较高的名次,但是又担心自己实力不足而导致不能获奖,
因此他制定一个策略,查看往届游戏排名第三的人的分数,通过这个分数来制定自己的目标, 如果游戏中不同分数只有两个或者更少(往届比赛一定会有人参加),则直接将最大的分数作为自己的目标。但是游戏公布的分数是乱序的,你能帮帮小明吗?
输入
第一行输入为数组长度,第工行为数组元素
- \(1 \le nums.length \le 10000\)
- \(-2^{31} \le nums[i] \le 2^{31} - 1\)
输出
最大分数
样例
1 | 输入: |
解答
按照题意模拟即可,读入所有整数后去重,再排序,按要求输出倒数第一大或者是第三大的数。
代码
1 | input() |
3、replace
张三在一块白板上写了\(n\)个数字,记作\(a_i\),李四对白板上的数字进行了\(m\)次修改,每次修改李四会将白板上的一个数字修改成\(b_j\)。张三想知道经过这\(m\)次修改,白板上所有数字之和可能的最大值是多少。
输入
第一行输入两个整数\(n,m(1\le n,m\le 1000)\)
第二行输入\(n\)个整数\(a_1,a_2,\dots,a_n(1\le a_i\le 10^9)\)
第三行输入\(m\)个整数\(b_1,b_2,\dots,b_m(1\le b_j\le 10^9)\)
输出
输出白板上所有数字之和的最大值
样例
1 | 输入: |
解答
需要注意的是,这道题想表达的是第\(j\)次操作取\(b_j\)替换\(a\)中的某个数,总共进行\(m\)次。
为了保证\(a\)中的数和最大,每次只需要将\(a\)中最小的数进行替换即可。
代码
1 | from queue import PriorityQueue |
4、world
小杰在凌晨打游戏的时候被一股神秘力量牵引,进入了一个魔幻世界。
魔幻世界中危险遍布,刚落地的小杰听到恶龙咆哮已经瑟瑟发抖了。
为了能在异世界中活下来,小杰希望你能帮他计算异世界中安全区的个数。
已知小杰能力值为\(X\),异世界是一个\(n\)行\(m\)列二维数组\(a,a[i][j]\)表示该地方的危险程度。
当小杰的能力值大于等于该地方的危险程度则表示该地方安全。安全区由一个或多个安全的地方组成,且这些地方互相连通。
输入
第一行包含一个正整数\(T(T\le 1000)\),\(T\)代表数据组数
接下来\(T\)组数据,每组测试数据第一行三个正整数\(n,m,x\)
第二行开始为异世界不同地方的危险程度\(a[i][j]\)
\(1\le n\le 1000,1\le m\le 1000,1\le X\le 1000,1\le a[i][j] \le 1000\)
题目保证: \(T*N*M\le 10^7\)
输出
对于每组输入输出一个安全区的个数,如果没有满足要求的安全区则输出"Orz"! (不包括引号)
样例
1 | 输入: |
解答
一道中规中矩的BFS题目。判断矩阵的每个元素是否超过\(X\),从而将其处理成一个01矩阵,再通过BFS来寻找这个矩阵中的连通块数量即可。
代码
1 |
|
5、line
假设平面上有\(n\)条直线,且不存在三条或以上直线共点的情况,求这\(n\)条直线可能存在多少种不同交点数。
例\(n=2\),则可能的交点数量为\(0\)(平行)或者\(1\)(不平行)。
输入
输入数据包含多个测试实例,每个测试实例占一行。每行包含一个正整数\(n(n\le 20),n\)表示直线的数量。
输出
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
样例
1 | 输入: |
解答
首先回顾一下这个观点:两条直线如果没有交点,当且仅当它们是平行的。
这意味着我们可以对这些直线划分成多个组,组内的直线是平行的,组间的直线是不平行的。因此可以考虑使用动态规划的思想解决,每次为当前的直线添加\(j\)条相互平行的直线,并且这\(j\)条直线和原来的直线相交,从而产生交点。
更具体的来说,令\(S_i\)表示有\(i\)条直线时,它们的交点个数的集合。如果\(x\in S_{i-j}\),并且为这个方案再添加\(j\)条平行线(它们和原来的直线都不平行),那么就会和原来的\(i-j\)条直线总共产生\(j(i-j)\)个新交点。因此\(S_i\)的递推式可以形式化地写出为:
\[S_i=\bigcup_{j=1}^i\{x+j(i-j)\mid x\in S_{i-j}\}\]
其中\(S_0=\{0\}\),因为没有直线就不会有交点。最终只需要打印集合\(S_n\)中的所有数即可。
代码
1 |
|