题目的主要信息:

  • 一球从hhh米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第nnn次落地时共经过了多少米?第nnn次返弹多高?
  • 输出保留小数点后1位

具体做法:

我们遍历落地次数,第一次走过了落下高度这么多距离,然后弹起高度降低一半,然后走了弹起的高度这么多距离,完成一次循环,如果nnn个循环,累加距离,不断降低高度。需要注意最后一次落地后虽然要计算弹起的高度,我们还要输出它,但是我们走过的距离已经没有它的,我们此时已经是落地nnn次了,第n次落地相当于第n-1次弹起

利用C++的cout控制浮点数的输出位数我们要用到iomanip头文件,将cout.setf(ios::fixed)写在输出前面用于控制不足位数补零,并且在输出数据前要加<< fixed << setprecision(1)控制输出位数。

alt

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

int main() {

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

	cin >> h;
	cin >> n;
    double dis = 0;
    for(int i = 0; i < n; i++){
        dis += h; //每次加上落下来的距离
        h /= 2; //弹起距离缩短一半
        if(i == n - 1){
            cout.setf(ios::fixed); //不足位自动补齐
            cout << fixed << setprecision(1) << dis << " " << fixed << setprecision(1) << h << endl; 
        }
        dis += h; //弹上去走的距离
    }
	return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),一次遍历
  • 空间复杂度:O(1)O(1)O(1),无额外空间