小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推直到全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)
给定四个整数A,B,C,D,请返回所求结果。
测试样例:
100,90,80,70
返回:1020
public int calcDistance(int A, int B, int C, int D) {
// write code here
return (int) ((int)oneDistance(A/1.0)+oneDistance(B/1.0)+oneDistance(C/1.0)+oneDistance(D/1.0));
}
public double oneDistance(double a){
if(a==0){
return 0;
}
return a+a/2+oneDistance(a/2);
}
import java.util.*;
public class Balls {
public int calcDistance(int A, int B, int C, int D) {
// write code here
double sum = 0;
double tmp = 0;
int[] Hight = {A,B,C,D};
for(int i=0;i<4;i++){
tmp = Hight[i];
while(tmp!=0){
sum =sum+ tmp+tmp/2;
tmp = tmp/2;
}
}
return (int) Math.ceil(sum);
}
}
递归?
public class Balls {
double oneDistance(double n){
if(n == 0)
return 0;
return n + n/2 + oneDistance(n/2);
}
public int calcDistance(int A, int B, int C, int D) {
// write code here
return (int)(oneDistance(A) + oneDistance(B) + oneDistance(C) + oneDistance(D));
}
}
import java.util.*;
public class Balls {
public int calcDistance(int A, int B, int C, int D) {
return (int) (sum(A)+sum(B)+sum(C)+sum(D));
}
private double sum(double n) {
double d = n;
double sum=n;//将第一次下落的n值加入,从第一次上升开始算,直接乘以2
while(d>0){
d=d/2;
sum+=d*2;
}
return sum;
}
}
import java.util.*;
public class Balls {
public int calcDistance(int A, int B, int C, int D) {
int sum = 0;
sum += fun(A);
sum += fun(B);
sum += fun(C);
sum += fun(D);
return sum;
}
public double fun(double high){
double sum = high;
while(high != 0){
if(Math.ceil(high) == 1){
sum += 2;
break;
}
high /= 2;
sum += 2*high;
}
return sum;
}
/*
可以分解为两部分:1、N米高时只经过一次;2、其它高度有往返
对应第二种情况计算: 等比数列首项a1 = N/2,公比为1/2,
故求和式Sn = a1*(1-q^n)/(1-q)
变为 Sn = (N/2) * (1-(1/2)^n)/(1-1/2) = 2*N*(1-(1/2)^n);
由于n有无穷项故Sn有极限 = 2*N;
故总共为N+2*N = 3*N;
public int fun(int high){
return 3*high;
}
*/
}
import java.util.*;
public class Balls {
//题目并不难。但是看这题的时间限制是3秒,感觉应该不是用普通的方法做
//普通的方法就是除2运算。
//这里必须要有精度。不能用int来做,不然结果肯定不正确,
//就像25/2如果是int的话结果是12,但是如果是float的话结果就是12.5
//这样无形之间就在丢失高度,所以结果肯定不正确。用double也可以。只要有精度就可以
public int calcDistance(int A, int B, int C, int D) {
//再就是100下落 ,反弹到50的位置,上升50,下落也是50,
//所以50的位置应该加100,而不是50,所以相当于有个错位
//把反弹到50的时候当成100的位置计算,把反弹到25的当成50的计算。
//所以temp一开始将所有的起始高度都加了一遍。
float temp = A+B+C+D , E=(float)A ,F=(float)B, G=(float)C ,H=(float)D;
while(E/2!=0&&F/2!=0&&G/2!=0&&H/2!=0){
temp+=E;
temp+=F;
temp+=G;
temp+=H;
E = E/2;
F = F/2;
G = G/2;
H = H/2;
}
//最后结果还必须向上取整,不然的话直接强转会丢失精度。
return (int) Math.ceil(temp);
}
sn = x + x * (1 + 1/2 + 1/4 + ... + (1/2)^m)
sn = x + x * (1- (1/2)^m) / (1-1/2)
(1/2)^m 无限接近于0
sn = x + x * 2;
sn = 3x;
所以答案为 3*(A+B+C+D)
不知道这样说对不。。。