首页 > 试题广场 >

抛小球

[编程题]抛小球
  • 热度指数:14004 时间限制: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)
这道题题目说的太过模糊
发表于 2016-12-29 11:17:53 回复(0)

import java.util.*;

public class Balls {
    double distance(double n){
        if(n==0)
            return 0;
        return n+n/2+distance(n/2);
    }
    public int calcDistance(int A, int B, int C, int D) {
        return (int)(distance(A)+distance(B)+distance(C)+distance(D));
    }
}
这题想要的思路应该是这样的,注意大转小需要强制转化。
发表于 2016-04-08 17:36:13 回复(2)
每次从最高处落下再到返回至下次的最高点,用以下公式可推倒出:
(1+1/2)+(1/2+1/4)+(1/4+1/8)+......+(1/n+1/2n)        n->正无穷
=3*(1/2+1/4+1/8+......1/2n)
=3*(1-1/2+1/2-1/4+1/4-1/8+......1/n-1/2n)
=3*(1-1/2n)   n->正无穷
=3
所以答案为3*(A+B+C+D)
发表于 2016-03-30 21:06:35 回复(6)
这道题,应该是考数学吧,,,字有点难看,将就一下哈
代码如下:
public int calcDistance(int A, int B, int C, int D) {
return 3*(A+B+C+D);//就这一行
}

编辑于 2018-08-18 17:28:56 回复(0)
class Balls:
    def calcDistance(self, A, B, C, D):
        return 3 * sum([A, B, C, D])

发表于 2016-12-29 00:28:36 回复(0)
这道题有点坑其实,题目说数字都是整数,我以为中间弹回去的高度也是整数,其实不是,中间的计算需要用float,也就是说参数ABCD先换成float,再计算。最后再把结果四舍五入成整数就对了 
发表于 2016-09-07 23:41:28 回复(2)
这题考的不是算法,考的应该是对精确度的处理

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)
萌头像
既然要求都为整数。怎么可能是等比数列?
发表于 2016-05-26 16:00:26 回复(2)
//看讨论才知道中间过程不能直接用int计算,需要转换为float;
class Balls {
public:
    int height(int n){
        float R=0,m=n;
        while(m){
            R+=m+m/2;
            m/=2;         
        }
        return ceil(R);
    }
    int calcDistance(int A, int B, int C, int D) {
        return height(A)+height(B)+height(C)+height(D);
    }
};

发表于 2016-09-03 11:01:58 回复(0)
classBalls:
    def calcDistance(self, A, B, C, D):
        # write code here
        sum = A+B+C+D
        returnsum*4- sum
就是等比数列求和
发表于 2015-10-11 14:47:20 回复(5)
✭头像
# 1. 除法要为浮点数除法   2.结果要向上取整
# -*- coding:utf-8 -*-
import math
class Balls:
    def hight(self, h):
        sum = h
        while(h!=0):
            h=float(h)/2 #只有python2的环境,所以要先转化h为浮点数进行除法
            sum+=2*h
        return math.ceil(sum) #向上取整
    def calcDistance(self, A, B, C, D):
        # write code here
        return self.hight(A)+self.hight(B)+self.hight(C)+self.hight(D)

发表于 2019-08-29 16:47:54 回复(0)
发表于 2019-07-04 17:33:00 回复(0)

python:



class Balls:
    def calcDistance(self, A, B, C, D):
        return 3 * (A + B + C + D)
发表于 2018-04-13 19:40:56 回复(1)

大家的极限真的是6666,给大佬递百事可乐

package com.special.first;

import java.util.Scanner;

/**
 * 京东02-抛小球
 *
 * 以前做过,不过现在做这个题,我有了更好的思路
 *
 * 因为我们发现下一次的弹跳的高度为上一次的一半
 * 但又因为弹上去后又落下相同的高度,所以下一次弹跳的总长度等于上一次的弹跳高度
 * 所以我们用一个变量表示上一次的弹跳的高度
 * 当我们计算下一次弹跳的总长度时就可以直接加上上一次的弹跳高度
 * 并更新弹跳高度作为下一次弹跳使用
 * Create by Special on 2018/3/4 14:56
 */
public class Pro039 {

    private static double calcDistance(double dis){
        double result = dis;
        while(dis != 0){
            result += dis;
            dis /= 2;
        }
        return result;
    }

    public static int calcDistance(int A, int B, int C, int D) {
        return (int) Math.ceil(calcDistance(A) + calcDistance(B)
                + calcDistance(C) + calcDistance(D));
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int A = input.nextInt();
            int B = input.nextInt();
            int C = input.nextInt();
            int D = input.nextInt();
            System.out.println(calcDistance(A, B, C, D));
        }
    }
}
编辑于 2018-03-04 15:32:04 回复(0)
class Balls {
public:
    int calcDistance(int A, int B, int C, int D) {
        return 3*(A+B+C+D);
    }
};

发表于 2017-10-11 01:11:01 回复(0)
a0=n
a1=n/2+n/2=n
a2=n/4+n/4=n/2
a3=n/8+n/8=n/4
.......
从a1开始往后,就可以看做是一个等比数列,比例q=0.5
对这个等比数列求和,得到和为:a1*(1-q^n)/(1-q),当n趋于无穷大时,q^n=0,可以得到和为:n/(1-0.5)=2n,
整个数列之和就是小球运动的总路程=n+2n=3n米。
所以直接一句:return 3*(A + B + C + D);即可
编辑于 2017-07-25 18:43:12 回复(2)
class Balls {
public:
    int calcDistance(int A, int B, int C, int D) {
        /*求极限的题,设首次下落高度为X,则落地后弹回1/2除,但一上一下,行程为2倍。故第一次落地到弹起共走了1/2X+1/2X=X
        故总路程为 X + (X + 1/2 X + 1/4 X + 1/8 X + ~~~ + 趋于0)
        括号内为等比数列 等比数列求和公式 Sn = lim(a1 * (1 - q^n)/1-q) = X*(1)/0.5 = 2X
        总路程为 3 X */
        int sum = (A+B+C+D)*3 ;
        return sum;
    }
};

发表于 2017-07-18 13:19:27 回复(1)
个人的理解,不知道还有没有人做这道题……
S=(A+B+C+D)[(1+1/2)+(1/2+1/4)+(1/4+1/8)+......+(1/n+1/2n)]        n->正无穷
2S=(A+B+C+D)[2+1+(1+1/2)+(1/2+1/4)+(1/4+1/8)+......+(1/n+1/2n)]       
     =3(A+B+C+D)+(A+B+C+D)[(1+1/2)+(1/2+1/4)+(1/4+1/8)+......+(1/n+1/2n)]
S=2S-S=3(A+B+C+D)
发表于 2017-07-14 21:08:30 回复(0)
import java.util.*;
public class Balls {
    public int calcDistance(int A, int B, int C, int D) {
        return (A+B+C+D)*3;
    }
}

编辑于 2017-05-19 14:13:02 回复(0)
class Balls {
public:
    int calcDistance(int A, int B, int C, int D) {
        return 3*(A+B+C+D);
    }
};

发表于 2017-03-01 21:17:31 回复(0)