小北的身高是 1.65 米。班上有 n 个小朋友,小北想和身高最接近自己的人交朋友。如果有多个小朋友 与小北的身高差相同,小北想和其中身高较矮的第一个小朋友做朋友。横线处应该填入的是( )。
int n, i;
float target, h, best_height, min_diff, diff;cout << "请输入小朋友的人数: ";
cin >> n;
target = 1.65;
best_height = 0.0;
min_diff = 100.0;
for (i = 0; i < n; i++) {cout << "请输入第 " << i << " 个小朋友的身高: ";
cin >> h;
diff = abs(h - target);
if (____________________) { // L1
min_diff = diff;
best_height = h;
}
}cout << "小北的朋友身高为: " << best_height;
看到题先想"找最小差值,差值相同选更矮的"。关键观察是初始化min_diff=100.0确保第一个一定更新。每一步推理依据:diff<min_diff直接更新,diff==min_diff时再比较身高。提炼通法:先找最小值,再处理平局时选更优的。
选项B用<=却要求h<best_height,导致diff<min_diff时仍被过滤;选项C用&&把两个条件绑死,漏掉diff<min_diff但h>=best_height的情况;选项D用||把身高条件独立,导致diff>min_diff但h<best_height时错误更新。题目最阴险的细节是"差值相同选更矮的"这一语义陷阱,B的<=看似宽松实则收紧,C的&&看似严谨实则漏判,D的||看似灵活实则越界。
本题考查GESP二级《基础算法》中的最小值选择。命题人卡住的是考生对"先找最小值再处理平局"这一两步逻辑的混淆,绝大多数人只写diff<min_diff,忘了平局时身高比较。
看到题先想"找最小差值,差值相同选更矮的"。关键观察是初始化min_diff=100.0确保第一个一定更新。每一步推理依据:diff<min_diff直接更新,diff==min_diff时再比较身高。提炼通法:先找最小值,再处理平局时选更优的。