刷题记录-牛妹的蛋糕
牛妹的蛋糕
https://www.nowcoder.com/practice/1f7280d9897d4305b2da6790fe131729
第一天牛妹吃掉蛋糕总数三分之一(向下取整)多一个,第二天又将剩下的蛋糕吃掉三分之一(向下取整)多一个,以后每天吃掉前一天剩下的三分之一(向下取整)多一个,到第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;