反弹高度构成公比 1/2 的等比数列,总路程=初始下落+前 9 次反弹的往返,即 3h-h/512;第 10 次反弹高 h/1024,按 6 位有效数字输出。
OJ: roj
题目 ID: 1085
难度:入门
标签:模拟等比数列浮点输出
创建: 2026-09-29 18:05
更新: 2026-10-05 00:33
题目描述
一球从高度 double 保存,用 cout << x 或 printf("%g", x) 输出即可(6 位有效数字、去尾零)。
样例输入:20;样例输出:59.9219 与 0.0195312。
思路
反弹高度构成公比
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 18:05
# update_at: 2026-09-29 18:05
import sys
LANDINGS = 10 # 题面固定的落地次数
def solve() -> None:
h = float(next(sys.stdin)) # 初始高度
# 总路程 = 初始下落 h + 前 9 次反弹的往返(第 i 次反弹高度为 h / 2^i,往返各一次)
total = h + sum(h / 2**i * 2 for i in range(1, LANDINGS))
# 输出格式对齐 C++ 的 cout 默认行为:6 位有效数字、去掉多余末尾 0,即 %g
print("%g" % total)
print("%g" % (h / 2**LANDINGS)) # 第 10 次反弹的高度
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 00:33
* update_at: 2026-10-05 00:33
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int LANDINGS = 10; // 题面固定的落地次数
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
double h; // 初始高度,用 double 保存
cin >> h;
// 总路程 = 初始下落 h + 前 9 次反弹的往返(第 i 次反弹高度为 h/2^i,往返各一次)
double total = h;
double cur = h / 2.0;
for (int i = 1; i < LANDINGS; i++) {
total += 2.0 * cur; // 当前曲线的来回各一段
cur /= 2.0; // 下一段反弹高度减半
}
// 第 10 次反弹的高度
double h10 = h / (1LL << LANDINGS); // h / 2^10 = h / 1024,用 64 位整数保证精确
// 输出对齐 C++ cout 默认行为:6 位有效数字、去尾零
cout << total << "\n" << h10 << "\n";
return 0;
}