题解:洛谷 B4495 交朋友
【题目来源】
洛谷:B4495 [GESP202603 一级] 交朋友 - 洛谷
【题目描述】
Alice 班上共有 4 个小朋友,身高分别为 \(H_1\), \(H_2\), \(H_3\), \(H_4\),其中 Alice 的身高为 \(H_1\)。Alice 想要和身高最接近她的人交朋友,如果有多个人符合条件,则 Alice 想和其中较矮的那一人做朋友,你能告诉她这个人的身高是多少吗?
【输入】
输入共 4 行,第 \(i\) 行包含一个整数 \(H_i\),表示班上小朋友的身高。
【输出】
输出 1 行,包含一个整数 \(h\),表示 Alice 想交的朋友的身高。
【输入样例】
150
165
135
133
【输出样例】
135
【核心思想】
-
问题分析:给定 4 个身高值 \(H_1, H_2, H_3, H_4\)(\(H_1\) 为 Alice 的身高),需要在 \(H_2, H_3, H_4\) 中找到与 \(H_1\) 身高差绝对值最小的人。若存在多人身高差相同,则选择身高较矮者。本质是带平局处理的最小距离搜索问题。
-
算法选择:
- 线性扫描比较:初始化最优候选为 \(H_2\),依次与 \(H_3, H_4\) 比较,根据比较规则更新最优解
-
关键步骤:
- 初始化:最优身高 \(\text{minh} = H_2\),最小高度差 \(\text{minn} = |H_1 - H_2|\)
- 遍历比较(对 \(H_3, H_4\)):
- 计算当前高度差 \(d = |H_i - H_1|\)
- 若 \(d < \text{minn}\):更新 \(\text{minh} = H_i\),\(\text{minn} = d\)
- 否则若 \(d = \text{minn}\) 且 \(H_i < \text{minh}\):更新 \(\text{minh} = H_i\)(平局时选较矮者)
- 输出结果:\(\text{minh}\)
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定 3 次比较
- 空间复杂度:\(O(1)\),仅使用常数个变量
-
带平局处理的最小距离搜索核心思想:
- 双重比较条件:优先比较"距离"(身高差绝对值),距离更小时无条件更新;距离相等时引入第二关键字"身高本身"进行平局裁决
- 贪心局部最优:每次比较只关注当前候选与当前最优的相对关系,由于比较规则具有传递性,线性扫描即可得到全局最优
- 初始化策略:将第一个候选 \(H_2\) 作为初始最优解,避免空值判断,简化代码结构
- 可扩展性:虽然本题固定为 4 人,但算法可自然扩展到 \(N\) 人场景(循环遍历 \(H_2\) 到 \(H_N\))
- 适用于带优先级排序的最近邻搜索、多关键字比较等基础决策问题
【算法标签】
入门 #语法基础
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h1, h2, h3, h4; // 定义四个整数变量,表示四个高度
cin >> h1 >> h2 >> h3 >> h4; // 从标准输入读取四个高度值
int minh = h2; // 初始化最小高度差对应的高度为h2
int minn = abs(h1 - h2); // 初始化最小高度差为h1和h2的差的绝对值
// 比较h3和h1的高度差
if (abs(h3 - h1) < minn || (abs(h3 - h1) == minn && h3 < minh))
{
minh = h3; // 如果h3的高度差更小,或者高度差相同但h3更矮,则更新最小高度
minn = abs(h3 - h1); // 更新最小高度差
}
// 比较h4和h1的高度差
if (abs(h4 - h1) < minn || (abs(h4 - h1) == minn && h4 < minh))
{
minh = h4; // 如果h4的高度差更小,或者高度差相同但h4更矮,则更新最小高度
minn = abs(h4 - h1); // 更新最小高度差
}
cout << minh << endl; // 输出与h1高度差最小的高度值,如果高度差相同则输出较小的那个高度
return 0; // 程序正常结束
}
【运行结果】
150
165
135
133
135
浙公网安备 33010602011771号