华为OD机试 2024C卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
中秋节,公司分月饼,m个员工,买了n个月饼,m<=n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2<=3,单人分到第n-1多月饼个数是Max(n-1),单人分到第n多月饼个数是Max(n),Max(n-1)-Max(n)<=3问有多少种分月饼的方法?
二、输入描述
每一行输入m n,表示m个员工,n个月饼,m<=n
三、输出描述
输出有多少种月饼分法
1、输入
2 4
2、输出
2
3、说明
分法有2种
4=1+3
4=2+2
注意:1+3和3+1算一种分法
四、解题思路
1、全局变量:
m: 员工总数。
n: 月饼总数。
maxDiff: 员工之间分到的月饼数最大允许的差。
ans: 满足条件的分月饼方案数量。
2、递归函数 distribute:
level: 当前正在为第 level 个员工分配月饼。
min: 当前员工可以分得的最少月饼数。
max: 当前员工可以分得的最多月饼数。
remain: 还剩多少个月饼未分配。
3、递归逻辑:
- 如果是最后一个员工 (level == m - 1),将剩余的所有月饼都分给他。如果这种分配方式满足条件(最后一个员工和倒数第二个员工之间的月饼数差不超过3),则方案计数增加。
- 对于非最后一个员工,遍历可能的月饼数(从 min 到 max),递归地调用函数以分配给下一个员工。需要注意的是,调整下一个员工的 min 和 max 来保证他们得到的月饼数不少于当前员工且不超过剩余月饼数的均分。
五、Java算法源码
public class OdTest01 {static int m;static int n;static int maxDiff = 3;static int sum = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);m = sc.nextInt();n = sc.nextInt();if (m == 1) {// 如果只有一个员工分月饼,那么就只有一种方案System.out.println(1);return;}// 初始化递归分配,每个员工至少分一个月饼,所以最初可用的月饼数减去mdistribute(0, 1, n / m, n);System.out.println(sum);}/*** 递归分配月饼** @param level 当前员工索引(0起始)* @param min 当前员工可以分得的最少月饼数* @param max 当前员工可以分得的最多月饼数* @param remain 剩余未分配的月饼数*/public static void distribute(int level, int min, int max, int remain) {if (level == m - 1) {// 最后一个员工必须将所有剩余的月饼拿走if (remain - min <= maxDiff) {sum++;// 如果符合条件,答案加1}return;}// 递归为每个员工分配月饼for (int i = min; i <= max; i++) {// 剩余的月饼需要足够分给当前员工remain -= i;distribute(level + 1, i, Math.min(i + maxDiff, remain / (m - level - 1)), remain);remain += i;}}
}
六、效果展示
1、输入
3 12
2、输出
6
3、说明
满足要求的有6种分法:
12=1+1+10(Max1=10,Max2=1,不满足要求)
12=1+2+9(Max1=9,Max2=2,不满足要求)
12=1+3+8(Max1=8,Max2=3 不满足要求)
12=1+4+7(Max1=7,Max2=4,Max3=1, 满足要求)
12=1+5+6(Max1=6,Max2=5,Max3=1,不满足要求)
12=2+2+8(Max1=8,Max2=2,不满足要求)
12=2+3+7(Max1=7,Max2=3,不满足要求)
12=2+4+6(Max1=6,Max2=4,Max3=2,满足要求)
12=2+5+5(Max1=5,Max2=2,满足要求)
12=3+3+6(Max1=6,Max2=3,满足要求)
12=3+4+5(Max1=5,Max2=4,Max3=3,满足要求)
12=4+4+4(Max1=4,满足要求)
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。