[语言月赛 202312] 灵活控分 题解

· · 题解

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;

视频讲解