A. 牛牛分蛋糕
题目描述
牛牛今天家里要来客人,所以牛牛今天特意做了他最拿手的两种蛋糕,但是他是一个有洁癖的人,所以他在分蛋糕时,有如下几个原则:
-
他不希望一个盘子里出现两种蛋糕
-
他希望每个盘子中都有蛋糕
-
他想让装有最少蛋糕数量的盘子中装有的蛋糕数量尽可能多
备注:
n, a, b(1 ≤ a, b ≤ 10^5, 2 ≤ n ≤ a + b)
第一个参数代表盘子的数量
第二个参数代表第一种蛋糕的数量
第三个参数代表第二种蛋糕的数量。
程序应返回:在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量。
示例1
输入
5, 2, 3
输出
1
说明
只有一种方法把蛋糕分配到盘子里,即所有的盘子上都有一个蛋糕。
示例2
输入
4, 7, 10
输出
3
说明
第一个盘子中装有第一种蛋糕三个,第二个盘子中装有第一种蛋糕四个,第三个、第四个盘子中各装有第二种蛋糕五个。
解法一:暴力搜盘子
思路分析
要想装最少蛋糕数量的盘子中装的蛋糕最多,必定是均匀分配蛋糕。因此可以搜索所有的盘子分配方案,看哪种情况下均匀分配到的蛋糕最多。
时间复杂度: O ( n ) O(n) O(n)。总共有 n − 1 n - 1 n−1 种盘子分配方案。
空间复杂度: O ( 1 ) O(1) O(1)。
代码实现
public int solve (int n, int a, int b) {
int res = 0;
for(int i = 1; i < n; i++) {
int min = Math.min(a / i, b / (n - i));
res = Math.max(res, min);
}
return res;
}
解法二:二分搜蛋糕
思路分析
每个盘子都分配 c c c 块蛋糕,若 a / c + b / c ≥ n a / c + b / c \ge n a/c+b/c≥n 说明这样分配能使 n n n 个盘子中都有蛋糕。二分搜索寻找最大的 c c c 即可。
时间复杂度: O ( l o g ( m i n ( a , b ) ) ) O(log(min(a,b))) O(log(min(a,b)))。
空间复杂度: O ( 1 ) O(1)