public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 处理函数,返回在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量
     * @param n int整型 n个盘子
     * @param a int整型 a蛋糕数量
     * @param b int整型 b蛋糕数量
     * @return int整型
     */
   public int splitCake(int n, int a, int b) {
        if (a + b == n) {
            return 1;
        }
        //标准2分框架 , 套就完事了, 右边最大值肯定是 A+B的和
        int left = 0, right = a + b;
        while (left < right) {
            int mid = left + (int)Math.ceil((right - left) / 2.0);
            if (check(mid, n, a, b)) {
                //够分的话 , 缩小左侧区间
                left = mid;
            } else {
                //这里为什么是-1 ?  因为  mid肯定是不够分的, 所以值要减少
                right = mid - 1;
            }
        }
        //返回left , right 随便那个。
        return left;

    }

    /**
     * 是否够分? true 够 。
     *
     * @param mid 最少值
     * @param n   盘子数
     * @param a  A 蛋糕数量
     * @param b  B 蛋糕数量
     * @return
     */
    private boolean check(int mid, int n, int a, int b) {
        int count = 0;
        while (a - mid > 0){
            a -= mid;
            count++;
        }
        while (b - mid > 0){
            b -= mid;
            count++;
        }
        //如果count数量大于 盘子数, 说明是够分的。 
        return count >= n ;
    }
}