题意整理。

  • 一个小球从h高度落下,每次反弹高度是原高度的一半。
  • 求第n次落地时,经过了多少米,第n次反弹多高。

方法一(循环)

1.解题思路

  • 利用循环计算每次反弹时的高度(记为h),以及经过了多少米(记为dist)。
  • 由于要输出的是第n次落地时走了多少米,所以dist要减去最后反弹的高度h。

动图展示: alt

2.代码实现

#include <iostream>
#include <iomanip>
using namespace std;

int main() {

    // 下落的高度和落地的次数
    double h;
    int n;

    cin >> h;
    cin >> n;

    //记录第n次反弹时总共走过的记录
    double dist=0;
    for(int i=1;i<=n;i++){
        h/=2;
        //向下过程中走2*h,反弹h高度,总共3*h
        dist+=h*3;
    }
    //由于要输出的是第n次落地时走了多少米,所以dist要减去最后反弹的高度h
    cout<<fixed<<setprecision(1)<<dist-h<<" "<<h<<endl;

    return 0;
}

3.复杂度分析

  • 时间复杂度:循环总共执行n次,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)