【笔试刷题】携程-2026.04.12-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

携程-2026.04.12

题目一:双仓配货

1️⃣:固定构造 42n-4 即可。

2️⃣:关键结论是所有不小于 4 的偶数都是合数。

难度:Low

题目二:灯带调色窗口

1️⃣:翻转区间内部边不会变,只有左右边界会变。

2️⃣:把问题转成最大化两个边界收益之和。

难度:Mid

题目三:归一化梯度训练器

1️⃣:按固定公式实现 NGD,学习率是 η₀ / √t

2️⃣:处理好 JSON 输入输出和浮点数保留规则。

难度:Mid

题目四:分裂总能量

1️⃣:先把大数字模拟缩到只剩 12

2️⃣:剩余过程用二维矩阵快速幂推进数量。

难度:High

1. 双仓配货

问题描述

小兰需要把总量为 的货物拆到两个仓库里,两个仓库最终拿到的货物量分别记为

现在有两个要求:

  • 都必须是合数

其中,合数指大于 且不是质数的正整数, 都不算合数。

如果存在可行方案,输出任意一组满足条件的 ;如果不存在,输出 -1

输入格式

第一行输入一个整数 ,表示测试数据组数。

接下来 行,每行输入一个正整数

输出格式

对于每组数据:

  • 如果无解,输出 -1
  • 否则输出两个正整数

样例输入

3
1
4
7

样例输出

-1
4 4
6 8

数据范围

样例 解释说明
样例1 的第 ,不可能拆成两个合数,所以输出 -1
样例1 的第 ,可以拆成
样例1 的第 ,可以拆成

题解

这题不需要真的去找很多方案,只要找到一组固定构造就够了。

先看一个很稳定的选择:

只要 ,就有:

  • ,它本身就是合数。
  • ,而且它一定是偶数。

一个不小于 的偶数一定是合数,所以这时答案一定存在。

反过来看,如果 ,那么 。两个最小的合数都是 ,它们加起来已经是 ,所以更小的和根本凑不出两个合数。

因此结论很直接:

  • 时输出 -1
  • 时输出 42n - 4

复杂度分析

每组数据只做常数次判断,时间复杂度是 ,总时间复杂度是 ,空间复杂度是

参考代码(Python)

import sys

def input() -> str:
    return sys.stdin.readline().strip()

def solve() -> None:
    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__":
    solve()

2. 灯带调色窗口

问题描述

K 小姐手里有一条长度为 的灯带,每个位置只有两种颜色状态:01

相邻两个灯珠之间共有 条连接边,第 条边连接位置 和位置 ,它的权重是

如果一条边两端的灯珠状态相同,那么这条边会贡献自己的权重。所有这类边权之和,定义为整条灯带的稳定值。

现在允许进行至多一次操作:

  • 选择一个连续区间
  • 把区间内的每个字符同时翻转,即 0110

也可以不做任何操作。

请输出操作后稳定值的最大可能值。

输入格式

第一行输入一个整数 ,表示灯珠数量。

第二行输入一个长度为 的二进制字符串

第三行输入 个整数

输出格式

输出一个整数,表示最大稳定值。

样例输入

5
01010
2 1 3 4

样例输出

7

样例输入

6
111000
1 2 3 4 5

样例输出

15

数据范围

样例 解释说明
样例1 把区间 翻转后,灯带变成 00100,此时第 条边两端相同,答案是
样例2 原串本身已经是最优情况,不做操作时稳定值就是

题解

这题看起来像区间翻转,但真正会变化的边其实只有区间的两侧边界。

假设翻转的是区间

为什么只有边界会受影响

对于区间内部的任意一条边,它的两个端点都会一起翻转:

  • 原来相同,翻转后仍然相同
  • 原来不同,翻转后仍然不同

所以区间内部所有边的贡献都不会改变。

真正可能变化的,只有:

  • 左边界这条边
  • 右边界这条边

如果区间顶到边界,那么对应那一侧根本没有边,变化量就是

把每条边的变化量单独记下来

对于第 条边,也就是连接 的边:

  • 如果原来两端相同,翻转其中一侧后会变成不同,收益是
  • 如果原来两端不同,翻转其中一侧后会变成相同,收益是

记成数组

  • ,当
  • ,当

再额外补两个哨兵:

这样翻转区间 的总收益就统一写成:

问题就变成了:

  • 在下标满足 的前提下
  • 最大化

这里令

线性扫描求最大值

从左到右枚举右端点 ,同时维护前面出现过的最大 ,就能在线性时间内求出最大收益。

最后答案是:

多出来的这个 对应“不翻转也可以”。

复杂度分析

只需要一次扫描,时间复杂度是 ,空间复杂度是

参考代码(Python)

import sys

def input() -> str:
    return sys.stdin.readline().strip()

def solve() -> None:
    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__":
    solve()

3. 归一化梯度训练器

问题描述

小兰正在调试一个简化版的 NGD(Normalized Gradient Descent)训练器。

给定训练集特征矩阵 、训练标签向量 ,目标函数定义为:

其中参数固定为:

梯度为:

轮先把梯度归一化成单位 向量,再按衰减学习率更新:

初始权重向量取全

如果某一轮出现下面任意一种情况:

  • 梯度中出现 NaNInf
  • 梯度范数不是有限值

那么这一轮直接跳过更新,但轮次仍然照常计入总步数。

完成 轮后,用最终权重对测试集做线性预测:

若某个预测值大于等于 ,对应

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务