【笔试刷题】携程-2026.04.12-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
携程-2026.04.12
题目总览
| 题号 | 题名 | 主要做法 | 难度 |
|---|---|---|---|
| 1 | 双仓配货 | 数论构造 | 简单 |
| 2 | 灯带调色窗口 | 邻接边贡献 + 区间翻转 | 中等 |
| 3 | 归一化梯度训练器 | 数值模拟 | 困难 |
| 4 | 分裂总能量 | 递推 + 快速幂/矩阵转移 | 困难 |
这套 4 月 12 日的携程题单跨度比较大。前两题偏转化和观察,第三题直接切到数值计算,第四题则要把分裂过程压成稳定递推。做题时如果模型切换不够快,后两题会明显拖时间。
1. 双仓配货
问题描述
小兰需要把总量为 的货物拆到两个仓库里,两个仓库最终拿到的货物量分别记为
和
。
现在有两个要求:
和
都必须是合数
其中,合数指大于 且不是质数的正整数,
和
都不算合数。
如果存在可行方案,输出任意一组满足条件的 ;如果不存在,输出
-1。
输入格式
第一行输入一个整数 ,表示测试数据组数。
接下来 行,每行输入一个正整数
。
输出格式
对于每组数据:
- 如果无解,输出
-1 - 否则输出两个正整数
样例输入
3
1
4
7
样例输出
-1
4 4
6 8
数据范围
样例说明
- 样例1 的第
组:
,不可能拆成两个合数,所以输出
-1。 - 样例1 的第
组:
,可以拆成
。
- 样例1 的第
组:
,可以拆成
。
题解
这题不需要真的去找很多方案,只要找到一组固定构造就够了。
先看一个很稳定的选择:
- 取
- 取
只要 ,就有:
,它本身就是合数。
,而且它一定是偶数。
一个不小于 的偶数一定是合数,所以这时答案一定存在。
反过来看,如果 ,那么
。两个最小的合数都是
,它们加起来已经是
,所以更小的和根本凑不出两个合数。
因此结论很直接:
时输出
-1时输出
4和2n - 4
复杂度分析
每组数据只做常数次判断,时间复杂度是 ,总时间复杂度是
,空间复杂度是
。
参考代码(Python)
import sys
input = lambda:sys.stdin.readline().strip()
def solve() -> None:
# Read input in ACM mode and build the answer directly.
t = int(input())
out = []
for _ in range(t):
n = int(input())
if n < 4:
out.append("-1")
else:
out.append(f"4 {n * 2 - 4}")
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
# Standard ACM entry.
solve()
2. 灯带调色窗口
问题描述
园子手里有一条长度为 的灯带,每个位置只有两种颜色状态:
0 或 1。
相邻两个灯珠之间共有 条连接边,第
条边连接位置
和位置
,它的权重是
。
如果一条边两端的灯珠状态相同,那么这条边会贡献自己的权重。所有这类边权之和,定义为整条灯带的稳定值。
现在允许进行至多一次操作:
- 选择一个连续区间
- 把区间内的每个字符同时翻转,即
0变1,1变0
也可以不做任何操作。
请输出操作后稳定值的最大可能值。
输入格式
第一行输入一个整数 ,表示灯珠数量。
第二行输入一个长度为 的二进制字符串
。
第三行输入 个整数
。
输出格式
输出一个整数,表示最大稳定值。
样例输入
5
01010
2 1 3 4
样例输出
7
样例输入
6
111000
1 2 3 4 5
样例输出
15
数据范围
样例说明
- 样例1:把区间
翻转后,灯带变成
00100,此时第条边两端相同,答案是
。
- 样例2:原串本身已经是最优情况,不做操作时稳定值就是
。
题解
这题看起来像区间翻转,但真正会变化的边其实只有区间的两侧边界。
假设翻转的是区间 。
为什么只有边界会受影响
对于区间内部的任意一条边,它的两个端点都会一起翻转:
- 原来相同,翻转后仍然相同
- 原来不同,翻转后仍然不同
所以区间内部所有边的贡献都不会改变。
真正可能变化的,只有:
- 左边界这条边
- 右边界这条边
如果区间顶到边界,那么对应那一侧根本没有边,变化量就是 。
把每条边的变化量单独记下来
对于第 条边,也就是连接
和
的边:
- 如果原来两端相同,翻转其中一侧后会变成不同,收益是
- 如果原来两端不同,翻转其中一侧后会变成相同,收益是
记成数组 :
,当
,当
再额外补两个哨兵:
这样翻转区间 的总收益就统一写成:
问题就变成了:
- 在下标满足
的前提下
- 最大化
这里令 ,
。
线性扫描求最大值
从左到右枚举右端点 ,同时维护前面出现过的最大
,就能在线性时间内求出最大收益。
最后答案是:
多出来的这个 对应“不翻转也可以”。
复杂度分析
只需要一次扫描,时间复杂度是 ,空间复杂度是
。
参考代码(Python)
import sys
input = lambda:sys.stdin.readline().strip()
def solve() -> None:
# Read input in ACM mode and build the answer directly.
n = int(input())
s = input()
w = list(map(int, input().split()))
base = 0
for i in range(n - 1):
if s[i] == s[i + 1]:
base += w[i]
gain = [0] * (n + 1)
for i in range(1, n):
if s[i - 1] == s[i]:
gain[i] = -w[i - 1]
else:
gain[i] = w[i - 1]
best_pre = gain[0]
best_add = 0
for i in range(1, n + 1):
cur = best_pre + gain[i]
if cur > best_add:
best_add = cur
if gain[i] > best_pre:
best_pre = gain[i]
print(base + best_add)
if __name__ == "__main__":
# Standard ACM entry.
solve()
3. 归一化梯度训练器
问题描述
小兰正在调试一个简化版的 NGD(Normalized Gradient Descent)训练器。
给定训练集特征矩阵 、训练标签向量
,目标函数定义为:
其中参数固定为:
梯度为:
第 轮先把梯度归一化成单位
向量,再按衰减学习率更新:
初始权重向量取全 。
如果某一轮出现下面任意一种情况:
- 梯度中出现
NaN或Inf - 梯度范数不是有限值
那么这一轮直接跳过更新,但轮次仍然照常计入总步数。
完成 轮后,用最终权重对测试集做线性预测:
若某个预测值大于等于 ,
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
查看3道真题和解析