class Balls {
public:
int calcDistance(int A, int B, int C, int D) {
// write code here
return 3*(A+B+C+D);
}
};
/**
假设初始高度为 X,则第一次落地经历距离为X; 反跳回高度为 X/2, 因此第二次落地经历距离为 X/2(此时没有考虑跳回经历的距离),
第三次为 X/2 的 1/2, 既X/4,每下一次都是上一次的1/2,一般会由此想到等比数列,公比q=1/2
假设需要n次该小球不再弹起, 第一次 A1=X*q^1-1=X, A2=A1*q^(2-1)=A1*q=A1*1/2, A3=A1*q^(3-1)
则最后一次经历的距离为 An=A1*q^(n-1)
题目要求可认为该等比数列在n趋于正无穷大时的和:
Sn=A1+A2+A3+...+An
(1) Sn=A1+A1*q^1+A1*q^2+...+A1*q^(n-1)
给(1)式等号左右俩边同时乘 公比q 得(2)式:
(2) q*Sn=A1*q+A1*q^1+A1*q^2+...+A1*q^n
使用(1)式 减 (2)式 的(3)式:
Sn-q*Sn=A1-A1*q^n 化简
(1-q)Sn=A1(1-q^n)
Sn=A1(1-q^n) / (1-q)
当n趋于正无穷大时 limt(n->+)q^n ~= 0(q<1)
因此上式 Sn=A1 / (1-q)
当A1=X,q=1/2时: Sn=2*X
该题还应该考虑每次反跳的X/2都会经历俩次(回跳一次,然后再落地又一次),除了第一次,之后每次都是俩倍距离,如下图
============================================================================================
首次
下落
↓|
↓|
↓| 第1次回跳
↓| 后再下落
↓| ↑| ↓| 第2次回跳
↓| ↑| ↓| 后再下落 第3次回跳
↓| ↑| ↓| ↑| ↓| 后再下落
↓| ↑| ↓| ↑| ↓| ↑| ↓|............
============================================================================================
因此重写和公式:
Sn=A1 + 2*A1*q + 2*A1*q^2 + ... + 2*A1*q^(n-1)
Sn=A1(1 + 2q + 2q^2 + ... + 2*q^(n-1))
q*Sn=A1*q + 2*A1*q^2 + ... + 2*A1*q^n
(1-q)Sn=A1 + A1*q - 2*A1*q^n
Sn=(A1 + A1*q - 2*A1*q^n) / (1-q)
Sn=A1*(1 + q - 2*q^n) / (1-q)
limt(n->+)q^n ~= 0(q<1)
Sn=A1*(1 + 1/2 - 2 * 0) / (1/2)
Sn=3A1, 由此得出一个球的经历距离为3A;
*/