笔试2022招商银行.分蛋糕

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到一个盘子里有多少蛋糕,首先想到用二分做。
具体思路
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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值