【笔试刷题】携程-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
  • 时输出 42n - 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. 灯带调色窗口

问题描述

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

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

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

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

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

也可以不做任何操作。

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

输入格式

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

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

第三行输入 个整数

输出格式

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

样例输入

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)训练器。

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

其中参数固定为:

梯度为:

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

初始权重向量取全

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

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

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

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

若某个预测值大于等于 ,

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

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

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

全部评论

相关推荐

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

创作者周榜

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