题目
大象喝水
题目描述
一只大象口渴了,要喝 20 20 20 升水才能解渴,但现在只有一个深 h h h 厘米,底面半径为 r r r 厘米的小圆桶 ( h h h 和 r r r 都是整数)。问大象至少要喝多少桶水才会解渴。
Update:数据更新,这里我们近似地取圆周率 π = 3.14 \pi = 3.14 π=3.14。
输入格式
输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深 h h h 和底面半径 r r r,单位都是厘米。
输出格式
输出一行,包含一个整数,表示大象至少要喝水的桶数。
样例 #1
样例输入 #1
23 11
样例输出 #1
3
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ h ≤ 500 1 \leq h \leq 500 1≤h≤500, 1 ≤ r ≤ 100 1 \leq r \leq 100 1≤r≤100。
错误题解
#include <iostream>
using namespace std;
#include<math.h>
#include<string>
#include<algorithm>
#include<iomanip>
int main(){
int h, r;
cin>>h>>r;
double v = 3.14*r*r*h;
int n = 20000/v;
if (20000%(int)v != 0)
n += 1;
cout<<n;
}
正确题解
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double r,c,h,pi,v,water;
pi=3.14;
cin>>h>>r;
v=pi*r*r*h/1000.0;
water=20.0/v;
c=ceil(water);
cout<<c<<endl;
return 0;
}
错误原因解析
我们假设输入的高度 h 为 10,半径 r 为 2。现在我们来计算容器的数量。
首先,计算容器的体积:
double v = 3.14 * r * r * h;
// v = 3.14 * 2 * 2 * 10 = 125.6
现在,我们使用第一个代码片段:
double n = ceil(20000 / v);
// n = ceil(20000 / 125.6) = ceil(159.235668) = 160
现在我们使用第二个代码片段:
int n = 20000 / v;
// n = 20000 / 125.6 = 159
if (20000 % (int)v != 0)
n += 1;
// 因为 20000 % 125 = 0,所以不执行 n += 1
在这个例子中,第一个代码片段通过向上取整确保了分配足够的容器数量,即 160 个,而第二个代码片段由于使用了整数除法,没有额外增加容器数量,只分配了 159 个容器。
如果我们进一步增加液体的总量,让容器的体积 v 稍微超出 20000,例如设为 126,则第一个代码片段会增加一个额外的容器以确保足够的存储空间,而第二个代码片段不会增加额外的容器,导致存储不足。
所得所思
ceil(n) 可以用于向上取整