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