[语言月赛 202312] 灵活控分 题解
Maxmilite
·
·
题解
Source & Knowledge
2023 年 12 月语言月赛,由洛谷网校入门计划/基础计划提供。
题目大意
给定一个非负整数 a,找到最小的非负整数 x,使得 \left \lfloor 10 \sqrt x \right \rfloor \geq a。
题目分析
本题考察对顺序结构的运用。
根据题目,可以得知 (\sqrt x) ^ 2 = \sqrt x \times \sqrt x = x。
我们对 \left \lfloor 10 \sqrt x \right \rfloor \geq a 这个式子做一点变形。
\begin{aligned}
& \left \lfloor 10 \sqrt x \right \rfloor \geq a \\
\Rightarrow & \left( \lfloor 10 \sqrt x \rfloor \right ) ^ 2\geq a ^ 2 = a \times a \\
\Rightarrow & (10 \times 10) \times \sqrt x \times \sqrt x \geq a ^ 2\\
\Rightarrow & 100 \times x \geq a ^ 2\\
\Rightarrow & 100 \times x \div 100 \geq a ^ 2 \div 100\\
\Rightarrow & x \geq a ^ 2 \div 100\\
\end{aligned}
由于 a \times a \div 100 可能是小数,因此我们需要让 x 取这个值上取整后的值。
C++ 的 cmath 库中有函数 ceil(x),代表对 x 上取整后的结果。
同时,在 C++ 中,当 a 是整数时,a * a / 100 中的除法为整数除法,结果默认为下取整,因此需要将 a 转换为 double 小数后再做运算。
核心代码如下:
int a;
cin >> a;
int ans = ceil((double) a * a / 100);
cout << ans << endl;
视频讲解