贝壳找房 · 穷举 · 算法编程题
贝壳找房 穷举 时限 1 秒 / 256 MB

题目描述

健美大咖想要维持身材,每天需要摄入 n 种营养物质,每种营养物质摄入的最低量为 a[i] 。但餐厅每天只能提供 m 份套餐,每份套餐包含各种营养物质的含量为 b[i] 。现在想知道,健美大咖最少需要购买多少份套餐,并请你给出具体购买方案?

输入输出

输入描述
第一行一个正整数,需要的营养物质种类数 n ;
第二行 n 个正整数,每种营养物质需要摄入的最低量 a[i] ;
第三行一个正整数m,餐厅提供的套餐份数 m ;
接下来 m 行,每行 n 个正整数,表示该套餐内每种营养物质量 b[i] 。
输出描述
第一行一个正整数,最少需要的购买的套餐份数 ans ;
第二行 ans 个正整数, 具体购买方案,即从小到大顺序排列的套餐编号。
(保证有解,若有多组解,输出字典序最小的一个)

样例共 1 组

样例 1 · 购买两份套餐即套餐1和套餐3,则1+20>=10,5+15>=20,1+37>=30,10+39>=40,且[1,3]时所有方案里字典序最小的,满足题意要求。
输入
4
10 20 30 40
3
1 5 1 10
20 38 20 30
20 15 37 39
输出
2
1 3

算法解析依据充分

考点:穷举

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:穷举

本题切入点

m 份套餐里挑最少几份覆盖全部营养需求,属于集合覆盖问题;范围小时可枚举子集并取字典序最小的最优解。

把候选答案空间全部列出来逐一检验,靠数据范围小来兜底。

思路框架(穷举 通法 · 非本题专属)

  1. 确定枚举什么(下标区间 / 子集 / 数值)。
  2. 用一层或多层循环(或递归)生成所有候选。
  3. 对每个候选判断是否满足题目条件,满足就统计或更新最优值。
  4. 先按数据范围估算枚举量,确认不会超时。

实现要点:多重循环是最直接的写法;枚举组合时可用递归 + 回溯,或用位掩码代表子集。

复杂度:时间 O(候选数 × 单次校验代价) | 空间 O(1)

该范式的通法易错点

  • 没先估复杂度,枚举量超出时限(这是最常见的超时原因)。
  • 去重没做好,同一种方案被多次统计。

样例解读

样例 1:输入 4 / 10 20 30 40 / 3 / 1 5 1 10 / 20 38 20 30 / 20 15 37 39 → 输出 2 / 1 3

购买两份套餐即套餐1和套餐3,则1+20>=10,5+15>=20,1+37>=30,10+39>=40,且[1,3]时所有方案里字典序最小的,满足题意要求。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:【2023】贝壳找房春招Java工程师笔试卷1;【2023】贝壳找房春招C++工程师笔试卷1;【2023】贝壳找房春招数据挖掘/机器学习工程师笔试卷1 等。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解