第一天牛妹吃掉蛋糕总数三分之一(向下取整)多一个,第二天又将剩下的蛋糕吃掉三分之一(向下取整)多一个,以后每天吃掉前一天剩下的三分之一(向下取整)多一个,到第n天准备吃的时候只剩下一个蛋糕。
牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?
输入n(day),要求输出int型 蛋糕的总体数量(也就是第一天有多少蛋糕)。
思考过程:
这种题目和斐波那契有些相似,最终的结果需要根据其他数值来推导。
假设第一天时有x个蛋糕,求x值
从day 1 到day n的变化情况如下:
| day | eat cake | left cake | 
|---|---|---|
| n | 1 | f(n) = 1 | 
| n-1 | 1/3 * f(n-2) +1 | f(n-1) = 2/3 * f(n-2) + 1 | 
| …… | …… | …… | 
| 2 | 1/3 * f(1) +1 | f(2) = 2/3 * f(1) - 1 | 
| 1 | 1/3 * x +1 | f(1) = 2/3*x - 1 | 
从上可得,x = (f(1) + 1) * 3/2,向下取整
仅知最后一天剩余1个,因此需从day n反推:
res(day n-1) =(f(n) + 1) * 3/2 = (1+1) * 3/2 = 3 (共2天,则第一天有3个蛋糕)
res (day n-2) = (f(n-2) + 1) * 3/2 = (3+1) *3/2 = 6 (共3天,则第一天有6个蛋糕)
res (day n-3) = (f(n-3) + 1) * 3/2 = (6+1) *3/2 = 10 (共4天,则第一天有10个蛋糕)
以上解法没有考虑更大数值的情况(判题有问题,所以就单纯按照下述代码写就可)
【不支持php,所以用python解答的】
import math;
class Solution:
    def cakeNumber(self , n ):
        # write code here
        if (n < 1):
            return 0;
        x = 1;
        for i in range(1,n):
            x = math.floor(3*(x+1)/2);
        return x;
京公网安备 11010502036488号