Alice 是班上四个小朋友之一,她的身高是 H1。现在她要从其他三个小朋友(身高 H2,H3,H4)中,找到身高与她自己 最接近 的一个人交朋友。如果有两个人与她的身高差距一样,她会选择 较矮 的那一个。
我们需要输出这个被选中的小朋友的身高。
数据范围很小(100≤Hi≤199),且四个身高互不相同,本题主要考察的是 比较与条件判断 的基础编程能力。
题目只涉及三个候选人身高(H2, H3, H4),我们完全可以用简单的分支结构逐一比较:
这种方法清晰直观,适合初学者理解和实现。
我们使用“打擂台”的思想:
mnd 记录当前找到的最小身高差距。ans 记录当前最优的朋友身高。初始时,把第一个人 H2 当作候选最优,然后依次挑战。
更新规则:
d < mnd,则无条件更新 ans = Hx,mnd = d。d == mnd && Hx < ans,则更新 ans = Hx,此时 mnd 不变(因为差距相等)。因为总共只有三个候选人,使用循环或直接写三遍判断都可以。
由于只比较固定的三个数,算法的时间复杂度是 O(1)。空间复杂度也是 O(1)。对于题目给出的数据规模完全没有压力。
下面是 C++ 实现,并附有详细注释:
cpp1#include <iostream> 2#include <cmath> // 包含abs函数,用于计算绝对值 3using namespace std; 4 5int main() { 6 int H1, H2, H3, H4; 7 cin >> H1 >> H2 >> H3 >> H4; 8 9 // 初始假设最接近的是H2 10 int ans = H2; 11 int mnd = abs(H1 - H2); // 记录当前最小差距 12 13 // 比较H3 14 int d = abs(H1 - H3); 15 if (d < mnd || (d == mnd && H3 < ans)) { 16 ans = H3; 17 mnd = d; // 如果d更小,则更新mnd;如果d相等且身高更矮,也更新ans,mnd不变 18 } 19 20 // 比较H4 21 d = abs(H1 - H4); 22 if (d < mnd || (d == mnd && H4 < ans)) { 23 ans = H4; 24 // 同样道理:d更小或相等且身高更矮时更新ans 25 } 26 27 cout << ans << endl; 28 return 0; 29}
abs(H1 - H2) 求出 Alice 与其他小朋友的身高差距。也可以自己写 if 判断正负再取绝对值。if (d < mnd || (d == mnd && H3 < ans)) 完美实现了题目要求:
d < mnd:找到一个距离更近的人。d == mnd && H3 < ans:距离相等,但此人更矮。mnd 也要同步更新;当距离相等时只更新 ans,mnd 不变。注意代码中如果 d == mnd && H3 < ans 成立,即使我们不重新给 mnd 赋值,它的值也不会错,因为 d 等于 mnd。所以可以安全地省略 mnd = d。ans 即为答案。这道题考察了基本的输入输出、绝对值计算以及多条件判断。核心在于如何在多个候选中按照双关键字(差距优先,相同差距时身高优先)选出最优解。类似的“打擂台”思路在后续更复杂的题目中也会频繁使用,是信息学竞赛的必备基础技能。