小F的糖果工厂挑战 | 豆包MarsCode AI刷题

37 阅读3分钟

题目

小F的糖果工厂能够生产nn种不同种类的糖果,糖果的编号从1到n。每天,工厂可以生产编号为i的ci个糖果。今天,小F接到了一个特殊的订单,订单要求生产a包糖果,每包糖果都必须是同一种类的,并且每包糖果的数量不能少于b个。你能帮小F计算一下,工厂至少需要多少天才能完成这个订单吗?

具体要求

  1. 糖果种类和数量

    • 工厂有 n 种糖果,每种糖果每天可以生产 c_i 个。
  2. 订单要求

    • 需要生产 a 包糖果。
    • 每包糖果的数量不能少于 b 个。
    • 每包糖果必须是同一种类的。
  3. 目标

    • 计算工厂至少需要多少天才能完成这个订单。

解题思路

代码解题思路

1. 理解问题

  • 我们需要计算最少的天数 d,使得每天生产的糖果总数能够满足订单要求。
  • 订单要求生产 a 包糖果,每包糖果的数量不能少于 b 个,每包糖果必须是同一种类的。

2. 二分查找

  • 由于我们需要找到最小的天数 d,可以使用二分查找来优化搜索过程。
  • 设 l 为最小天数(1天),r 为最大天数(可能的最大天数)。
  • 通过二分查找,逐步缩小范围,直到找到最小的 d

3. 检查函数 check

  • 编写一个检查函数 check(mid, candies, a, b),用于判断在 mid 天内是否能够生产足够的糖果来满足订单要求。
  • 如果 check(mid) 返回 true,说明 mid 天可以满足要求,继续在左半部分查找;否则在右半部分查找。

详细步骤

  1. 检查函数 check

    • 输入参数:mid(当前假设的天数),candies(每种糖果每天的生产数量),a(订单要求的包数),b(每包糖果的最小数量)。
    • 计算在 mid 天内,每种糖果能够生产的总包数。
    • 如果总包数 cnt 大于等于 a,返回 true,否则返回 false
  2. 主函数 solution

    • 计算每种糖果每天生产数量的最小值 mn
    • 初始化二分查找的左右边界 l 和 r
    • 使用二分查找,逐步缩小范围,直到找到最小的 d
    • 返回最小的天数 l
  3. 测试用例

    • 在 main 函数中,使用不同的测试用例来验证 solution 函数的正确性。

代码

public class Main {
    private static boolean check(int mid,int candies[], int a, int b)
    {
        int cnt=0;
         for(int i=0;i<candies.length;i++){
            cnt+=mid*candies[i]/b;
         }
         return cnt>=a;
    }
    public static int solution(int n, int a, int b, int[] candies) {
        // write code here
        int len=candies.length;
        int mn=candies[0];
        for(int i=0;i<len;i++) mn=Math.min(mn,candies[i]);
        int l=1,r=a*b/mn+1;//向上取整
        while(l<r){
            int mid=l+r>>1;
            if(check(mid,candies,a,b)){
               r=mid;
            }else{
                l=mid+1;
            }
        }
        return l;
    }

    public static void main(String[] args) {
        int[] candies1 = {7, 9, 6};
        int[] candies2 = {3, 10, 8, 4};
        int[] candies3 = {1, 10};
        
        System.out.println(solution(3, 10, 20, candies1) == 10);
        System.out.println(solution(4, 5, 15, candies2) == 4);
        System.out.println(solution(2, 100, 5, candies3) == 46);
    }
}

好的,让我们来详细解释一下你提供的代码。

代码解释

1. 检查函数 check

java

private static boolean check(int mid, int 

candies[], int a, int b) {

    int cnt = 0;

    for (int i = 0; i < candies.length; i

    ++) {

        cnt += mid * candies[i] / b;

    }

    return cnt >= a;

}

  • 功能:检查在 mid 天内是否能够生产足够的糖果来满足订单要求。

  • 参数

    • mid:当前假设的天数。
    • candies:每种糖果每天的生产数量。
    • a:订单要求的包数。
    • b:每包糖果的最小数量。
  • 逻辑

    • 初始化 cnt 为 0,用于记录在 mid 天内能够生产的总包数。
    • 遍历每种糖果,计算在 mid 天内每种糖果能够生产的总包数,并累加到 cnt 中。
    • 如果 cnt 大于等于 a,返回 true,表示在 mid 天内可以满足订单要求;否则返回 false