看到一个盘子里有多少蛋糕,首先想到用二分做。
具体思路:
a :
每个盘子里蛋糕数: i(大于等于2)->a 中a的因子
需要的盘子数: 1 - > a/ i
b :
每个盘子里蛋糕数:j(大于等于2)->b 中b的因子
需要的盘子数: 1 - > b/j
因此:最少的蛋糕数:min(i, j) 最多的蛋糕数:min(a, b)
错误之处:题目说每种蛋糕分到每个盘子里的数量是一样的且最少2个。所以蛋糕分的数量是 最小的因子->a中a的某个因子,不满足二分两边特性不一致的条件,所以不可以用二分,只能遍历O(n)做而不能O(logn),所以下面的for循环那里只能遍历 min(i, j) -> min(a, b) 而不能用二分做。。。
class Solution {
public:
bool f(int mid, int n, int a, int b) { //满足mid吗?
int tmp = n - (a / mid); //剩下的盘子数
if (a % mid == 0 && tmp > 0 && b % tmp == 0 && b / tmp >= mid) return true;
tmp = n - (b / mid); //剩下的盘子数
if (b % mid == 0 && tmp > 0 && a % tmp == 0 && a / tmp >= mid) return true;
return false;
}
int minCake(int n, int a, int b) {
if (n < 2) return 0;
int i = 2;
for (; i <= a; ++i) {
if (a % i == 0) break;
}
int j = 2;
for (; j <= b; ++j) {
if (b % j == 0) break;
}
if (n > a / i + b / j) return 0;
int ans = 0;
for (int k = min(i, j); k <= min(a, b); ++k) {
if (f(k, n, a, b)) {
ans = k;
break;
}
}
return ans;
}
};