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

172 阅读4分钟

解题思路与代码结构分析

题解分析

问题理解

题目要求计算糖果工厂至少需要多少天才能完成一个特殊的订单。订单要求生产 a 包糖果,每包糖果都必须是同一种类的,并且每包糖果的数量不能少于 b 个。工厂每天可以生产 c_i 个编号为 i 的糖果。

数据结构与算法选择

  1. 数据结构

    • 使用一个数组 candies 来存储每种糖果每天的生产数量。
  2. 算法步骤

    • 二分查找:由于我们需要找到最小的天数 d,使得在 d 天内可以生产至少 a 包糖果,每包糖果数量不少于 b 个,因此可以使用二分查找来优化时间复杂度。
    • 检查函数:定义一个检查函数 check(mid, candies, a, b),用于判断在 mid 天内是否可以完成订单。
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. 二分查找

    • l 和 r 分别表示天数的下界和上界。初始时,l 为 1,r 为 a * b / mn + 1,其中 mn 是 candies 数组中的最小值。
    • 通过二分查找,不断缩小范围,直到找到最小的 mid 天数,使得 check(mid, candies, a, b) 返回 true
  2. 检查函数

    • check 函数计算在 mid 天内,每种糖果可以生产的包数总和,判断是否满足订单要求。

关于二分随便唠两句。 最近一直在刷二分的题目。我认为难点有二。

1.想到这个题可以用二分。

一般来说,题目有二段性质,可以考虑二分。比如随着一个变量x的单调变化。 某一个性质在某一个点处出现了改变。或者是正向枚举循环复杂,可以考虑反向二分答案来解决。再就是典型的最大值最小和最小值最大系列问题,都可以考虑用二分来解决。

2.写check函数,理清逻辑。

check的写法往往是贪心。要利用好二分出来的这个mid,把它当做已知条件,去看另一个关联变量的变化。 check可以定义为性质合法,甚至有余裕。那么出口往往要去往让check不合法的方向去调整你的mid。

AI刷题的好处感想

使用AI进行刷题有以下几个显著的好处:

  1. 即时反馈:AI可以立即提供代码的正确性反馈,帮助用户快速发现和纠正错误。
  2. 学习效率:AI可以根据用户的代码提供优化建议,帮助用户理解更高效的算法和数据结构。
  3. 个性化指导:AI可以根据用户的水平和需求提供个性化的解题思路和代码框架,帮助用户逐步提升编程能力。
  4. 持续学习:AI可以记录用户的刷题历史和进步,提供持续的学习建议和挑战,帮助用户保持学习动力。

通过AI刷题,用户可以更高效地学习和掌握编程技能,提升解题能力,为实际项目开发打下坚实的基础。 通过这道题目的练习,我们不仅学会了如何利用二分解决组合问题,还深刻理解了 AI 在学习过程中所带来的便利和效率提升。在未来学习的道路上,我们可以结合 AI 辅助刷题功能与其他学习方法,共同助力我们的学习成效。

AI 辅助学习不仅提升了教育的质量和效率,也在不断改变学习者的学习体验和习惯。通过个性化的学习方式、实时反馈和丰富的资源,AI 正在引领教育的未来,使每个学习者都能在更高效的环境中成长。无论是初学者还是专业人士,善用 AI 学习工具都能为我们带来意想不到的学习效果。希望每位学习者都能在 AI 的助力下,走得更远,学得更好。