时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi的学校正面临着废校的大危机。面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像。
成为偶像团体的条件之一,就是3名团员之间的身高差越小越好。
已知ABC三个班同学的身高分别是A1..AN, B1..BM 和 C1..CL。请你从中选出3名同学Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小。
输入
第一行包含3个整数,N, M和L。
第二行包含N个整数,A1, A2, ... AN。(1 <= Ai <= 100000000)
第三行包含M个整数,B1, B2, ... BM。(1 <= Bi <= 100000000)
第四行包含L个整数,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
题目大意:
如题
分析
先找到一个队列中的数,再用lower_bound找到另外两个队列中大于或等于他们的数。然后3个队列,分成6种情况,分别二分搜索一遍即可。
需要注意,lower_bound如果没有找到返回值不在要搜索的区间范围内
代码:
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<vector> 5 #include<functional> 6 #include<algorithm> 7 typedef long long ll; 8 int a[110000],b[110000],c[110000]; 9 int ans=0x7fffffff; 10 void ss(int a[],int b[],int c[],int n,int m,int l) 11 { 12 for (int i=0;i<n;i++) 13 { 14 int pointa=a[i]; 15 int pointb=0x7fffffff/4,pointc=0x7fffffff/4; 16 int ptb = lower_bound(b, b+m, pointa)-b; 17 int ptc = lower_bound(c, c+l, pointa)-c; 18 if (ptb>=0&&ptb<m) pointb=b[ptb]; 19 if (ptc>=0&&ptc<l) pointc=c[ptc]; 20 int zans=abs(pointa-pointb)+abs(pointa-pointc)+abs(pointb-pointc); 21 // cout<<zans<<" "<<ptb<<" "<<ptc<<" "<<i<<" "<<pointa<<" "<<pointb<<" "<<pointc<<endl; 22 if (ans>zans) ans=zans; 23 } 24 } 25 int main() 26 { 27 int n,m,l; 28 cin>>n>>m>>l; 29 for (int i=1;i<=n;i++) 30 { 31 scanf("%d",&a[i-1]); 32 } 33 for (int i=1;i<=m;i++) 34 { 35 scanf("%d",&b[i-1]); 36 } 37 for (int i=1;i<=l;i++) 38 { 39 scanf("%d",&c[i-1]); 40 } 41 sort(a,a+n);sort(b,b+m);sort(c,c+l); 42 ss(a,b,c,n,m,l); 43 ss(a,c,b,n,l,m); 44 ss(c,b,a,l,m,n); 45 ss(b,a,c,m,n,l); 46 ss(c,a,b,l,n,m); 47 ss(b,c,a,m,l,n); 48 cout<<ans<<endl; 49 return 0; 50 }
时间: 2024-10-08 23:30:59