写在前面
本次给大家带来2026年8月20日百度算法方向笔试题的3道题,本场机考题目可在咱们平台上在线刷题。
第一题:给实例赋优先级连边,边权取较低优先级一侧的权重;把大正数排在更低优先级上拿更大倍数,非正数共享最高优先级,全非正时用最大值做星心。
第二题:电量守恒下做成回文;偶数长且总和为奇则无解,否则对每个对称对累加绝对差再向上取半,即为最少搬运次数。
第三题:反复交换最左下降相邻对,每次消一个逆序; 够大直接输出升序,否则模拟 次。
大厂笔试AI Coding练习:CodeFun2000.com/aicoder-gym
第1题-链路权重贡献最大化
题目内容
云侧在做双资源池隔离验收时,会给每个实例挂一整型重要度权重。现有 个实例,第 个实例的权重记为 。你需要给每个实例再赋一个整型优先级 ,并据此连出一张 个点的无向图(点编号 )。
对任意 :
若 ,则在 之间连边,边权为 ; 若 ,则在 之间连边,边权为 ; 若 ,则不连边。
也就是说:仅当两点优先级不同时才连边,边权等于优先级更低那一侧实例的权重。
图必须连通。在连通前提下,求所有边权之和的最大可能值。可以证明解一定存在。
连通图:任意两点之间都存在路径。
输入描述
第一行一个整数 (),表示询问个数。
接下来共 组询问,每组格式如下:
第一行一个整数 (),表示实例个数; 第二行 个整数 (),表示各实例权重。
保证单个文件中所有询问的 之和不超过 。
输出描述
对每个询问输出一行一个整数,表示最大边权之和。
样例1
输入
344 1 -2 330 -3 -152 5 1 4 3输出
19040说明
第 个询问:权重从大到小为 。给 更低且互不相同的优先级,给 相同的最高优先级,贡献 。
第 个询问:全部非正,取最大值 单独作为较低优先级,答案 。
第 个询问:全部为正,按从大到小赋递增优先级,贡献 。
题解
解题思路
本题要求构造优先级数组 ,使按“较低优先级一侧的权重 作为边权”连边后的图连通,且边权和最大。
对每个实例 , 的贡献次数等于「 严格大于 的实例个数」。 将 从大到小排序。正数应尽量排在较低的 上以获得更大倍数;非正数贡献非正,应共享最高 ,贡献为 。 若全部非正:不能所有 相同(否则不连通),最优是取最大值单独作为较低 ,答案为 。 若存在正数:正数赋互不相同的递增 ,非正数共享最高 ,答案为 (仅对正数项求和)。 时无边,答案为 。
复杂度分析
时间复杂度:(排序)。 空间复杂度:。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defsolve(v): n = len(v)if n == 1:return0# 从大到小排序,优先给大权重更大倍数 v = sorted(v, reverse=True)# 全部非正:最大值单独当较低优先级 rif v[0] <= 0:return v[0] * (n - 1) ans = 0for i, x in enumerate(v):if x <= 0:break# 后面共享最高 r,贡献 0# 排在第 i 位(0-index)时,有 n-1-i 个更高 r ans += x * (n - 1 - i)return ansq = int(input())for _ in range(q): n = int(input()) v = list(map(int, input().split())) print(solve(v))第2题-储能舱对称配重
题目内容
某场站有 个储能舱,第 舱当前电量记为 。运维希望各舱电量呈左右对称,即最终序列为回文:对所有 均有 。
每次操作可选两个不同下标 ,将 单位电量从 舱转到 舱:,。
求使序列变为回文的最少操作次数;若不可能,输出 。
输入描述
第一行一个整数 (),表示询问个数。
每组询问:
第一行一个整数 (); 第二行 个正整数 ()。
保证单个文件中所有询问的 之和不超过 。
输出描述
对每个询问输出一行一个整数:最少操作次数,无解则 。
样例1
输入
343 1 4 222 234 2 9输出
203说明
电量总量守恒。第 个询问总和 ,对称对差 ,最少 次。
第 个询问已是回文,答案 。
第 个询问只需两端相等,差 ,最少 次(例如得到 )。
题解
解题思路
操作在储能舱之间转移 单位电量,总量守恒,目标是变成回文且次数最少。
可行性:偶数长度时,回文序列总和必为偶数;若 为偶数且 为奇数,无解,输出 。奇数长度总有解。 配对:最终必须 。对每个对称对 ,两端差值 需要通过转移抹平。 代价:每次操作使某个舱 、另一舱 ,全局最少次数等于所有对称对差值和的一半(向上取整),即 。奇数差额可通过中间舱或其他配对消化。
复杂度分析
时间复杂度:。 空间复杂度:(不计输入)。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defsolve(c): n = len(c) s = sum(c)# 偶数长 + 奇数和:无法形成整数回文if n % 2 == 0and s % 2 == 1:return-1 diff = 0for i in range(n // 2):# 统计每个对称对的绝对差 diff += abs(c[i] - c[n - 1 - i])# ceil(diff/2)return (diff + 1) // 2q = int(input())for _ in range(q): n = int(input()) c = list(map(int, input().split())) print(solve(c))第3题-局部洗牌操作
题目内容
报文流水线里有一段长度为 的排列 。系统会执行恰好 次局部整理:
每次从左到右找到第一个满足 的位置 ,交换 与 。
若不存在这样的位置,该次操作什么也不做。
请输出 次操作后的排列。
输入描述
第一行一个整数 (),表示询问个数。
每组询问:
第一行两个整数 (,); 第二行 个互不相同的整数 ()。
保证单个文件中所有询问的 之和不超过 。
输出描述
对每个询问输出一行 个整数,为操作结束后的排列。
样例1
输入
35 22 3 1 5 43 1003 2 14 02 1 3 4输出
1 2 3 5 41 2 32 1 3 4说明
第 个询问:。
第 个询问:逆序足够少, 很大时最终升序为 。
第 个询问:,输出原排列。
题解
解题思路
每次找到最左的逆序相邻对并交换,等价于逐步消除逆序。
相邻逆序交换恰好使全局逆序数减 ,因此排成升序至多需要 次,其中 为逆序数,。 若 ,直接输出升序排列。 否则模拟恰好 次“最左逆序交换”;若中途已有序则提前结束。 因 ,直接模拟足够。
复杂度分析
时间复杂度:每组 ,在本题约束下可接受;若 很大则 排序。 空间复杂度:。
代码实现
python代码(C++和JAVA代码见在线OJ网址)
defsolve(s, t): n = len(s) s = s[:]# 逆序数上界,超过则已能排完 limit = n * (n - 1) // 2if t >= limit:return sorted(s)for _ in range(t): swapped = Falsefor i in range(n - 1):if s[i] > s[i + 1]:# 交换最左逆序对 s[i], s[i + 1] = s[i + 1], s[i] swapped = Truebreakifnot swapped:break# 已有序return sq = int(input())for _ in range(q): n, t = map(int, input().split()) s = list(map(int, input().split())) print(*solve(s, t))
夜雨聆风