题解:洛谷 B2029 大象喝水

【题目来源】

洛谷:B2029 大象喝水 - 洛谷

【题目描述】

一只大象口渴了,要喝 \(20\) 升水才能解渴,但现在只有一个深 \(ℎ\) 厘米,底面半径为 \(r\) 厘米的小圆桶(\(ℎ\)\(r\) 都是整数)。问大象至少要喝多少桶水才会解渴。

【输入】

输入有一行:包含两个整数,以一个空格分开,分别表示小圆桶的深 \(ℎ\) 和底面半径 \(r\),单位都是厘米。

【输出】

输出一行,包含一个整数,表示大象至少要喝水的桶数。

【输入样例】

23 11

【输出样例】

3

【核心思想】

  1. 问题分析:大象需要喝 \(20\) 升(\(20000\) 毫升)水解渴。给定一个圆柱形小圆桶的深度 \(h\) 和底面半径 \(r\)(单位:厘米),求至少需要多少桶水。这是一个圆柱体积计算 + 向上取整问题。

  2. 算法选择

    • 圆柱体积公式\(V = \pi r^2 h\)(单位:立方厘米 = 毫升)
    • 向上取整:桶数 = \(\lceil 20000 / V \rceil\),使用 ceil() 函数确保水量足够
  3. 关键步骤

    • 读入数据cin >> h >> r 读取深度和半径
    • 计算单桶容积v = 3.14 * r * r * h\(\pi\)\(3.14\)
    • 计算所需桶数ans = ceil(20000 / v)
      • \(20000\) 毫升 = \(20\)
      • ceil() 向上取整,确保即使最后一桶不满也必须算一桶
    • 输出结果cout << ans
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定次数的算术运算
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 几何计算的核心思想

    • 单位统一:将 \(20\) 升转换为 \(20000\) 毫升,与立方厘米(\(cm^3\))等价,避免单位换算错误
    • 向上取整必要性:"至少"意味着必须满足 \(\ge 20\) 升,任何余数都需要额外一桶
    • \(\pi\) 近似:题目未指定精度,取 \(3.14\) 为标准近似值
    • 适用于几何体积计算、资源分配、向上取整类入门问题

【算法标签】

入门 #语法基础

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
#include <math.h>         // 包含数学函数库(使用ceil函数)
using namespace std;      // 使用标准命名空间

// 全局变量定义
int h, r, ans;            // h: 水桶高度(cm), r: 水桶半径(cm), ans: 最终答案
double v;                // v: 单个水桶的容积(ml)

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    cin >> h >> r;        // 输入水桶的高度和半径

    // 计算单个水桶的容积(圆柱体积公式:V=πr²h)
    v = 3.14 * r * r * h;

    // 计算需要多少桶水才能满足20升的需求(20000ml)
    // 使用ceil函数向上取整,确保足够
    ans = ceil(20000 / v);

    cout << ans;          // 输出计算结果

    return 0;             // 返回程序执行成功状态码
}

【运行结果】

23 11
3
posted @ 2026-08-05 15:44  团爸讲算法  阅读(52)  评论(0)    收藏  举报