LuoguB2029 大象喝水 题解

Update

  • \(\texttt{2021.12.4}\) 修改了原先的错误代码,给各位造成影响,在此表示很抱歉。

Content

大象要喝 \(20\) 升水,但现在只有一个深 \(h\) 厘米,半径 \(r\) 厘米的桶。求大象至少要喝多少桶水。

数据范围:未知。

Solution

我们发现,这个桶其实就是一个圆柱体。那么我们回想一下,圆柱体的体积怎么算?

和其他柱体一样,圆柱也可以用 \(V=Sh\) 这个公式来算,又因为圆的面积 \(S=\pi r^2\),因此,圆柱的体积就可以表示为 \(V=\pi r^2h\)

那么在 C++ 中怎么表示呢?

有些同学可能知道,\(\pi\) 在 C++ 中可以用 acos(-1.0) 来表示,但是这超出了“入门”的范围。对于初学者,我们只需要取 \(\pi\) 的约值就好了,注意建议保留 \(7\) 位小数及以上,即 \(3.1415926\dots\)

那么回到这道题,大象要喝 \(20\) 升 = \(2\times 10^4\text{ ml}\) 水,所以我们不妨设要喝的桶数为 \(x\),则由题可以得到:

\[\begin{aligned}Vx&=20000\\\Rightarrow\pi r^2hx&=20000\\\Rightarrow x&=\dfrac{20000}{\pi r^2h}\end{aligned} \]

但是我们发现,\(x\) 绝大部分情况下不是整数,这可怎么办呢?这里如果向下取整的话又会导致最终大象喝的水 \(<20000\text{ ml}\),那么再喝一桶不是满的水不就好了吗?这相当于数学中的向上取整,表示为 \(\left\lceil x\right\rceil\),在 C++ 中的函数为 ceil(),需要调用 cmath 库。因此,我们可以得到最终的答案为 \(\left\lceil\dfrac{20000}{\pi r^2h}\right\rceil\),注意为了提高精度,需要将 \(20000\) 或者 \(\pi r^2h\) 变为一个浮点型变量。

Code

以下为笔者 18 年在 Openjudge 上面做这道题目时的代码。

#include <bits/stdc++.h>
using namespace std;

const double Pi=3.14159;

int main() {
	int r,h,v,ans;
	cin>>h>>r;
	v=Pi*r*r*h;
	if(20000%(int)v!=0)
		ans=20000/(int)v+1;
	else
		ans=20000/(int)v;
	cout<<ans;
	return 0;
} 
posted @ 2021-12-15 22:01  Eason_AC  阅读(623)  评论(0)    收藏  举报