解法一:
代码解析:
1. 核心思路:通过直径切分可以同时平分多个部分,而半径切分只能增加一个部分
2. 当总人数为偶数时,最优解是沿直径切n/2n/2n/2刀(如6人→3刀)
3. 当总人数为奇数时,必须沿半径切nnn刀(如5人→5刀)
4. 特殊情况处理:当只有1人时不需要切分
这个算法的时间复杂度是O(1)O(1)O(1),空间复杂度也是O(1)O(1)O(1),非常高效。通过数学分析可以证明这是最优解,因为:
* 直径切法每刀能增加最多份数
* 半径切法在无法使用直径切法时是最优选择
解法二:
算法思路
1. 问题分析:
* 直径切法:每刀沿直径切,可以将蛋糕分成2份、4份、6份...(每次增加2份)
* 半径切法:每刀沿半径切,可以将蛋糕分成1份、2份、3份...(每次增加1份)
2. 关键逻辑:
* 首先尝试用直径切法,因为效率更高(一刀能增加2份)
* 如果总人数是偶数,可以用直径切法完美分割
* 如果总人数是奇数,必须改用半径切法(因为直径切法只能产生偶数份)
3. 时间复杂度:
* 使用while循环计算刀数,时间复杂度为O(nO(nO(n)
* 但由于n的范围是10510^5105,这个复杂度是可以接受的
4. 边界情况:
* 当n=0n=0n=0时(只有小枫自己),不需要切蛋糕
* 当n=1n=1n=1时(小枫和1个朋友),需要1刀(半径切法)
这个算法巧妙地利用了两种切法的特性,通过比较两种切法的结果,选择刀数最少的方法。