【笔试刷题】虾皮-2026.03.10-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

虾皮-2026.03.10

这套题整体偏热身。第一题虽然是经典剪绳子,但如果没把“某一段到底继续剪还是直接停下”想清楚,动态规划就很容易写错;第二题几乎没有算法门槛,主要是按 ACM 输入格式稳定读取整行句子。

题目一:礼盒丝带分段

这题看上去像数学题,但在当前范围下直接写动态规划更稳。真正的状态含义不是“剪一刀之后怎样”,而是每一段都要再次判断继续拆和保持原样哪种收益更高。

难度:Mid

题目二:客服短句峰值

这题本质就是数空格。难点并不在算法,而是在读入时别把首行整数后面的换行和后续整句读取搞混。

难度:Low

礼盒丝带分段

问题描述

小柯正在准备一批礼盒。每个礼盒外面都要绑上丝带,仓库里正好有一卷长度为 的长丝带。

为了让礼盒看起来更精致,她决定把这卷丝带剪成至少两段,每一段的长度都必须是正整数。假设剪完后各段长度分别为 ,那么它们满足:

小柯希望这些长度的乘积尽可能大。请输出这个最大乘积。

例如,当 时,可以剪成 ,对应乘积为

输入格式

输入一个整数 ,表示丝带的总长度。

输出格式

输出一个整数,表示在至少剪成两段的前提下,所有方案中的最大乘积。

样例输入

2

样例输出

1

数据范围

样例 解释说明
样例1 长度为 的丝带只能剪成 ,乘积是
若输入为 10 可以剪成 ,此时乘积为 ,这是最优方案。

题解

这题表面上是在枚举怎么剪,真正难点在于某一段拿出来以后,到底是“继续剪”更优,还是“就保持这一段不动”更优。

由于 的范围只有 ,直接做动态规划最稳妥。

dp[i] 表示长度为 i 的丝带,在“允许继续往下拆”的前提下,能够得到的最大乘积。接下来枚举第一刀把它切成 ji-j 两段,那么左右两边都各有两种选择:

  • 不再继续剪,直接保留这一段长度。
  • 继续剪,使用这段已经算好的最优值。

于是转移就是:

这里的两个 max 很关键,它们正是在处理“继续剪还是停下”的选择。

为什么这样做是对的?

  • 任意一种合法方案,都可以看成先切出第一刀,再分别决定左右两部分是否继续拆。
  • 枚举 j 就覆盖了所有第一刀的位置。
  • 对于每个子问题,取“长度本身”和“继续拆出的最优乘积”中的较大值,就保证不会漏掉最优决策。

从小到大计算 dp[2]dp[n] 即可,因为每次转移只会用到更短的长度。

时间复杂度是 ,空间复杂度是 。在本题范围内完全够用。

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()


def solve():
    n = int(input())

    # dp[i] 表示长度为 i 的丝带能得到的最大乘积。
    dp = [0] * (n + 1)

    # 从短到长递推,保证用到的状态都已经算好。
    for i in range(2, n + 1):
        best = 0
        for j in range(1, i):
            # 左右两段都可以选择“继续剪”或“保持原样”。
            left = max(j, dp[j])
            right = max(i - j, dp[i - j])
            best = max(best, left * right)
        dp[i] = best

    print(dp[n])


if __name__ == "__main__":
    solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    // dp[i] 表示长度为 i 的丝带可得到的最大乘积。
    vector<long long> dp(n + 1, 0);

    for (int i = 2; i <= n; i++) {
        long long best = 0;
        for (int j = 1; j < i; j++) {
            // 左右两段都可以选择继续拆,或者直接保留长度本身。
            long long left = max<long long>(j, dp[j]);
            long long right = max<long long>(i - j, dp[i - j]);
            best = max(best, left * right);
       

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

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

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

全部评论
几乎都是lc原题,备考虾皮的直接刷力扣热题比较好
点赞 回复 分享
发布于 昨天 20:40 浙江

相关推荐

不想躺平的咸鱼_:本身就是免费开源的,镜像站反而帮项目扛了国内的大流量!SkillHub 把国内用户的访问都承接在本地,既给我们提速,又帮源站减轻了服务器压力,这明明是双赢的事,完全符合开源共享的精神。查看图片
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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