题目名称:偶像的条件
题目链接:偶像的条件
描述
小Hi的学校正面临着废校的大危机。面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像。
成为偶像团体的条件之一,就是3名团员之间的身高差越小越好。
已知ABC三个班同学的身高分别是 A 1 . . A N , B 1 . . B M A_1..A_N, B_1..B_M A1..AN,B1..BM 和 C 1 . . C L C_1..C_L C1..CL。请你从中选出3名同学 A i , B j , C k A_i, B_j, C_k Ai,Bj,Ck使得 D = ∣ A i − B j ∣ + ∣ B j − C k ∣ + ∣ C k − A i ∣ D=|A_i-B_j|+|B_j-C_k|+|C_k-A_i| D=∣Ai−Bj∣+∣Bj−Ck∣+∣Ck−Ai∣最小。
输入
第一行包含3个整数,N, M和L。
第二行包含N个整数, A 1 , A 2 , . . . A N 。 ( 1 < = A i < = 100000000 ) A_1, A_2, ... A_N。(1 <= A_i <= 100000000) A1,A2,...AN。(1<=Ai<=100000000)
第三行包含M个整数, B 1 , B 2 , . . . B M 。 ( 1 < = B i < = 100000000 ) B_1, B_2, ... B_M。(1 <= Bi <= 100000000) B1,B2,...BM。(1<=Bi<=100000000)
第四行包含L个整数, C 1 , C 2 , . . . C L 。 ( 1 < = C i < = 100000000 ) C_1, C_2, ... C_L。(1 <= Ci <= 100000000) C1,C2,...CL。(1<=Ci<=100000000)
对于30%的数据, 1 <= N, M, L <= 100
对于60%的数据,1 <= N, M, L <= 1000
对于100%的数据,1 <= N, M, L <= 100000
输出
输出最小的D。
样例输入
3 3 3
170 180 190
195 185 175
180 160 200
样例输出
10
解题思路
本来想的是暴力计算,不过看了题目分析之后发现使用二分法计算B,C中最接近A[i]的两个数字是最快的
完整代码
#include<bits/stdc++.h>
using namespace std;
#define N 100010
int n,m,k;
int A[N],B[N],C[N];
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>A[i];
for(int i=0;i<m;i++) cin>>B[i];
for(int i=0;i<k;i++) cin>>C[i];
//对A,B,C三个数组进行排序
sort(A,A+n);
sort(B,B+m);
sort(C,C+k);
int ans=0x3f3f3f3f;
int lb,lc,nb,nc;
for(int i=0;i<n;i++){
//使用lower_bound获取最接近A[i]的下标
lb=lower_bound(B,B+m,A[i])-B;
nb=abs(A[i]-B[lb])>abs(A[i]-B[lb-1])?B[lb-1]:B[lb];
lc=lower_bound(C,C+k,A[i])-C;
nc=abs(A[i]-C[lc])>abs(A[i]-C[lc-1])?C[lc-1]:C[lc];
ans=min(ans,abs(A[i]-nb)+abs(A[i]-nc)+abs(nb-nc));
}
cout<<ans<<endl;
return 0;
}