偶像的条件

题目名称:偶像的条件

题目链接:偶像的条件

描述

小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=AiBj+BjCk+CkAi最小。

输入

第一行包含3个整数,N, M和L。

第二行包含N个整数, A 1 , A 2 , . . . A N 。 ( 1 &lt; = A i &lt; = 100000000 ) A_1, A_2, ... A_N。(1 &lt;= A_i &lt;= 100000000) A1,A2,...AN(1<=Ai<=100000000)

第三行包含M个整数, B 1 , B 2 , . . . B M 。 ( 1 &lt; = B i &lt; = 100000000 ) B_1, B_2, ... B_M。(1 &lt;= Bi &lt;= 100000000) B1,B2,...BM(1<=Bi<=100000000)

第四行包含L个整数, C 1 , C 2 , . . . C L 。 ( 1 &lt; = C i &lt; = 100000000 ) C_1, C_2, ... C_L。(1 &lt;= Ci &lt;= 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值