首页 > 试题广场 >

抛小球

[编程题]抛小球
  • 热度指数:14022 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推直到全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)

给定四个整数A,B,C,D,请返回所求结果。

测试样例:
100,90,80,70
返回:1020
推荐
设整数为x,得到公式:
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)
不知道这样说对不。。。
编辑于 2016-03-26 12:47:34 回复(10)
采用递归可以快速解决
 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);
    }


发表于 2021-04-10 13:19:58 回复(0)
这道题,应该是考数学吧,,,字有点难看,将就一下哈
代码如下:
public int calcDistance(int A, int B, int C, int D) {
return 3*(A+B+C+D);//就这一行
}

编辑于 2018-08-18 17:28:56 回复(0)
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);
    }
}
发表于 2017-08-24 15:24:29 回复(0)
递归?
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));
    }
}

发表于 2017-07-13 22:28:41 回复(0)
public int calcDistance(int A, int B, int C, int D) {
        // write code here
        return (A+B+C+D)*3;
    }
答案就是这么任性。。。
发表于 2017-03-09 09:53:39 回复(0)
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;
		
	}
}

发表于 2016-09-09 12:56:27 回复(0)
这题考的不是算法,考的应该是对精确度的处理

float getJourney(float start){
        float sum = start;
        while(start > 0.00001){
            start /= 2;
            sum += start * 2;
        }
        return sum;
    }
    public int calcDistance(int A, int B, int C, int D) {
        // write code here
        float sum_all = 0;
        
        sum_all = getJourney(A) + getJourney(B) + getJourney(C) + getJourney(D);
        if(sum_all - (int) sum_all > 0.5){
            return (int) (sum_all + 1);
        }
        else{
            return (int) sum_all;
        }
    }
发表于 2016-09-06 14:04:11 回复(0)
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;
	}
*/
}

编辑于 2016-08-30 23:54:11 回复(0)
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);
    }

编辑于 2016-08-30 19:18:25 回复(0)