首页 > 试题广场 >

牛牛分蛋糕

[编程题]牛牛分蛋糕
  • 热度指数:864 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛今天家里要来客人,所以牛牛今天特意做了他最拿手的两种蛋糕,但是他是一个有洁癖的人,所以他在分蛋糕时,有如下几个原则:
1.他不希望一个盘子里出现两种蛋糕
2.他希望每个盘子中都有蛋糕
3.他想让装有最少蛋糕数量的盘子中装有的蛋糕数量尽可能多
示例1

输入

5,2,3

输出

1

说明

只有一种方法把蛋糕分配到盘子里,即所有的盘子上都有一个蛋糕。 
示例2

输入

4,7,10

输出

3

说明

第一个盘子中装有第一种蛋糕三个,第二个盘子中装有第一种蛋糕四个,第三个、第四个盘子中各装有第二种蛋糕五个。 

备注:
n,a,b(1 ≤ a, b ≤ 105, 2 ≤ n ≤ a + b)
第一个参数代表盘子的数量
第二个参数代表第一种蛋糕的数量
第三个参数代表第二种蛋糕的数量。
程序应返回:在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量。

不如视作数学问题,两家先分盘子,再各自分蛋糕,取最小
一行解决
int splitCake(int n, int a, int b) {
    return min(a/round((double)a*n/(a+b)),b/(n-round((double)a*n/(a+b))));
}


发表于 2021-07-09 16:28:47 回复(1)

贪心+暴力

忽略两种不能放在一盘,那么 最小值 = ,且至多有一盘是混装 数量大于等于这个最小值

加个盘子,蛋糕不变,一样的方法 最小值 = , n 个盘子合法,至多有一盘是混装 数量大于等于这个最小值​

所以值的范围 , 复杂度大概在​​

主要数据范围小,好像怎么都能过

    int splitCake(int n, int a, int b) {
        int m = min(min(a,b),(a+b)/n); // 数据较弱,没有min(a,b)也能过 2,10000,1000
        while(m){
            if(a/m+b/m >= n) return m;
            m-=1;
        }
        return m;
    }
发表于 2021-09-28 22:30:34 回复(0)
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 处理函数,返回在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量
     * @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分框架 , 套就完事了
        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 ;
    }

发表于 2021-05-19 14:53:32 回复(0)
这题和二分有关吗?
发表于 2021-03-17 23:37:12 回复(1)
class Solution:
    def solve(self , n , a , b ):
        # write code here
        ans=0
        for i in range(1,n):
            ans=max(ans,min(a//i,b//(n-i)))
        return ans
python4行
发表于 2020-09-30 11:05:23 回复(0)
客人数 m A蛋糕数 a B蛋糕数 b 最小蛋糕数为x=0 第一步,检查参数 蛋糕数不可小于客人数 第二步,蛋糕数正好等于客人数 每人一块蛋糕 第三步,结合B蛋糕算出A蛋糕最小盘数及最大盘数 第四步,A从最小盘数循环到最大盘数,B的盘数是客人数减去A的盘数 第五步,A蛋糕每盘最小数是 a/i B蛋糕每盘最小数是 b/(n-i) 两数中取小数 如果x=0或者两数中最小数大于x x=min(a/i,b/(n-i)) 循环结束即得出最小数中的最大值
发表于 2020-08-30 12:28:25 回复(0)

问题信息

难度:
6条回答 2758浏览

热门推荐

通过挑战的用户

查看代码