牛客题解 | 包裹运输
1.牛客题解 | 几个岛2.牛客题解 | 分割后处理3.牛客题解 | 分布式集群消息传递4.牛客题解 | 分玩具5.牛客题解 | 分田地6.牛客题解 | 分石头7.牛客题解 | 分苹果8.牛客题解 | 分贝壳9.牛客题解 | 列表补全10.牛客题解 | 删数11.牛客题解 | 删除公共字符12.牛客题解 | 删除重复字符13.牛客题解 | 删除重复字符_114.牛客题解 | 判断一棵满二叉树是否为二叉搜索树15.牛客题解 | 判断题
16.牛客题解 | 包裹运输
17.牛客题解 | 区间表达18.牛客题解 | 升级蓄水池19.牛客题解 | 单词缩写20.牛客题解 | 卡中心密码安全规范21.牛客题解 | 卡中心美食家22.牛客题解 | 厨艺大赛奖金23.牛客题解 | 友好城市24.牛客题解 | 双素数25.牛客题解 | 双色塔26.牛客题解 | 双袋购物27.牛客题解 | 发奖金28.牛客题解 | 古巴比伦迷宫29.牛客题解 | 句子反转30.牛客题解 | 吃鱼31.牛客题解 | 合唱团32.牛客题解 | 合并区间33.牛客题解 | 合并果子34.牛客题解 | 商品交易35.牛客题解 | 回合制游戏36.牛客题解 | 回文37.牛客题解 | 回文串38.牛客题解 | 回文序列39.牛客题解 | 回文数索引40.牛客题解 | 回文数组41.牛客题解 | 回文素数42.牛客题解 | 图的遍历43.牛客题解 | 图的闭包44.牛客题解 | 地下迷宫45.牛客题解 | 地牢逃脱46.牛客题解 | 地鼠逃跑计划47.牛客题解 | 堆棋子48.牛客题解 | 堆棋子_149.牛客题解 | 塔50.牛客题解 | 外卖满减51.牛客题解 | 多数组中位数52.牛客题解 | 多数组第 K 小数53.牛客题解 | 大家来扫雷54.牛客题解 | 大巴车(数组分块,按块翻转,块内不变)55.牛客题解 | 大数乘法56.牛客题解 | 大整数相乘57.牛客题解 | 头条校招58.牛客题解 | 奇数位丢弃59.牛客题解 | 奖学金60.牛客题解 | 奶牛编号61.牛客题解 | 好奇的薯队长62.牛客题解 | 如何添加运算符63.牛客题解 | 字母交换64.牛客题解 | 字母卡片65.牛客题解 | 字母数字混合排序66.牛客题解 | 字符串中找出连续最长的数字串67.牛客题解 | 字符串交错组成68.牛客题解 | 字符串价值69.牛客题解 | 字符串分割70.牛客题解 | 字符串匹配71.牛客题解 | 字符串压缩算法72.牛客题解 | 字符串复制73.牛客题解 | 字符串提取74.牛客题解 | 字符串旋转75.牛客题解 | 字符串是否由子串拼接76.牛客题解 | 字符串替换77.牛客题解 | 字符串替换_178.牛客题解 | 字符串最小变换次数79.牛客题解 | 字符串的排列80.牛客题解 | 字符串的旋转81.牛客题解 | 字符串相乘82.牛客题解 | 字符串组合83.牛客题解 | 字符串计数84.牛客题解 | 字符串距离85.牛客题解 | 字符串连连看86.牛客题解 | 字符串通配87.牛客题解 | 字符串问题88.牛客题解 | 字符混编89.牛客题解 | 字符编码90.牛客题解 | 字符覆盖91.牛客题解 | 字符迷阵92.牛客题解 | 字符迷阵_193.牛客题解 | 字符集合94.牛客题解 | 孙悟空的徒弟95.牛客题解 | 学数学96.牛客题解 | 安置路灯97.牛客题解 | 完成括号匹配98.牛客题解 | 实现字通配符*99.牛客题解 | 密码检查100.牛客题解 | 密码破译题目
解题思路
这是一个装箱问题:
- 需要将不同尺寸的正方形产品装入 的包裹中
- 每种产品的尺寸从 到 不等
- 目标是使用最少的包裹数量
关键思路:
- 的产品一个包裹只能放一个
- 的产品一个包裹只能放一个,剩余空间可以放 的产品
- 的产品一个包裹可以放一个,剩余空间可以放 和 的产品
- 的产品一个包裹可以放四个
- 的产品一个包裹可以放九个
- 的产品一个包裹可以放 个
代码
#include <iostream>
using namespace std;
void solve(int a[6]) {
int ans = 0;
// 处理6*6的箱子
ans += a[5];
// 处理5*5的箱子
ans += a[4];
a[0] = max(0, a[0] - 11 * a[4]); // 每个5*5箱子可以放11个1*1
// 处理4*4的箱子
ans += a[3];
int space4 = 5 * a[3]; // 4*4后的剩余空间可以放2*2和1*1
int use2 = min(a[1], space4); // 先放2*2
a[1] -= use2;
a[0] = max(0, a[0] - (space4 - use2) * 4); // 剩余放1*1
// 处理3*3的箱子
ans += (a[2] + 3) / 4; // 每4个3*3一个箱子
int rem3 = (4 - a[2] % 4) % 4; // 3*3剩余空间
if(rem3 > 0) {
int space3 = rem3 * 9; // 剩余空间
int use2_3 = min(a[1], space3 / 4); // 放2*2
a[1] -= use2_3;
a[0] = max(0, a[0] - (space3 - use2_3 * 4)); // 剩余放1*1
}
// 处理2*2的箱子
ans += (a[1] + 8) / 9; // 每9个2*2一个箱子
int rem2 = (9 - a[1] % 9) % 9; // 2*2剩余空间
if(rem2 > 0) {
a[0] = max(0, a[0] - rem2 * 4); // 剩余放1*1
}
// 处理1*1的箱子
ans += (a[0] + 35) / 36; // 每36个1*1一个箱子
cout << ans << endl;
}
int main() {
int a[6];
while(true) {
bool allZero = true;
for(int i = 0; i < 6; i++) {
cin >> a[i];
if(a[i] != 0) allZero = false;
}
if(allZero) break;
solve(a);
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void solve(int[] a) {
int ans = 0;
// 处理6*6的箱子
ans += a[5];
// 处理5*5的箱子
ans += a[4];
a[0] = Math.max(0, a[0] - 11 * a[4]); // 每个5*5箱子可以放11个1*1
// 处理4*4的箱子
ans += a[3];
int space4 = 5 * a[3]; // 4*4后的剩余空间可以放2*2和1*1
int use2 = Math.min(a[1], space4); // 先放2*2
a[1] -= use2;
a[0] = Math.max(0, a[0] - (space4 - use2) * 4); // 剩余放1*1
// 处理3*3的箱子
ans += (a[2] + 3) / 4; // 每4个3*3一个箱子
int rem3 = (4 - a[2] % 4) % 4; // 3*3剩余空间
if(rem3 > 0) {
int space3 = rem3 * 9; // 剩余空间
int use2_3 = Math.min(a[1], space3 / 4); // 放2*2
a[1] -= use2_3;
a[0] = Math.max(0, a[0] - (space3 - use2_3 * 4)); // 剩余放1*1
}
// 处理2*2的箱子
ans += (a[1] + 8) / 9; // 每9个2*2一个箱子
int rem2 = (9 - a[1] % 9) % 9; // 2*2剩余空间
if(rem2 > 0) {
a[0] = Math.max(0, a[0] - rem2 * 4); // 剩余放1*1
}
// 处理1*1的箱子
ans += (a[0] + 35) / 36; // 每36个1*1一个箱子
System.out.println(ans);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
int[] a = new int[6];
boolean allZero = true;
for(int i = 0; i < 6; i++) {
a[i] = sc.nextInt();
if(a[i] != 0) allZero = false;
}
if(allZero) break;
solve(a);
}
}
}
def solve(a):
ans = 0
# 处理6*6的箱子
ans += a[5]
# 处理5*5的箱子
ans += a[4]
a[0] = max(0, a[0] - 11 * a[4]) # 每个5*5箱子可以放11个1*1
# 处理4*4的箱子
ans += a[3]
space4 = 5 * a[3] # 4*4后的剩余空间可以放2*2和1*1
use2 = min(a[1], space4) # 先放2*2
a[1] -= use2
a[0] = max(0, a[0] - (space4 - use2) * 4) # 剩余放1*1
# 处理3*3的箱子
ans += (a[2] + 3) // 4 # 每4个3*3一个箱子
rem3 = (4 - a[2] % 4) % 4 # 3*3剩余空间
if rem3 > 0:
space3 = rem3 * 9 # 剩余空间
use2_3 = min(a[1], space3 // 4) # 放2*2
a[1] -= use2_3
a[0] = max(0, a[0] - (space3 - use2_3 * 4)) # 剩余放1*1
# 处理2*2的箱子
ans += (a[1] + 8) // 9 # 每9个2*2一个箱子
rem2 = (9 - a[1] % 9) % 9 # 2*2剩余空间
if rem2 > 0:
a[0] = max(0, a[0] - rem2 * 4) # 剩余放1*1
# 处理1*1的箱子
ans += (a[0] + 35) // 36 # 每36个1*1一个箱子
print(ans)
def main():
while True:
a = list(map(int, input().split()))
if all(x == 0 for x in a):
break
solve(a)
if __name__ == "__main__":
main()
算法及复杂度
- 算法:贪心
- 时间复杂度:,每个测试用例的处理时间是常数
- 空间复杂度:,只需要固定大小的数组
合集:
牛客笔试大厂真题题解2
分类:
牛客笔试大厂真题题解2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通