#1514 : 偶像的條件
時間限制:10000ms 單點時限:1000ms 內(nèi)存限制:256MB
描述
小Hi的學(xué)校正面臨著廢校的大危機(jī)。面對學(xué)校的危機(jī),小Hi同學(xué)們決定從ABC三個班中各挑出一名同學(xué)成為偶像。 ?
成為偶像團(tuán)體的條件之一,就是3名團(tuán)員之間的身高差越小越好。 ?
已知ABC三個班同學(xué)的身高分別是A1..AN, B1..BM?和 C1..CL。請你從中選出3名同學(xué)Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小。
輸入
第一行包含3個整數(shù),N, M和L。 ?
第二行包含N個整數(shù),A1, A2, ... AN。(1 <= Ai?<= 100000000)
第三行包含M個整數(shù),B1, B2, ... BM。(1 <= Bi?<= 100000000)
第四行包含L個整數(shù),C1, C2, ... CL。(1 <= Ci?<= 100000000)
對于30%的數(shù)據(jù), 1 <= N, M, L <= 100 ?
對于60%的數(shù)據(jù),1 <= N, M, L <= 1000 ?
對于100%的數(shù)據(jù),1 <= N, M, L <= 100000
輸出
輸出最小的D。
樣例輸入
3 3 3
170 180 190
195 185 175
180 160 200 樣例輸出
10 #include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+
5;
int n,m,l,a[N],b[N],c[N];
int ans=
2e9;
inline int read(){int x=
0,f=
1;
char ch=
getchar();while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=
getchar();}while(ch>=
'0'&&ch<=
'9'){x=x*
10+ch-
'0';ch=
getchar();}return x*
f;
}
inline int ABS(
int x){return x>
0?x:-
x;
}
int main(){
// freopen("sh.txt","r",stdin);n=read();m=read();l=
read();for(
int i=
1;i<=n;i++) a[i]=read();a[
0]=-1e9;a[n+
1]=
1e9;for(
int i=
1;i<=m;i++) b[i]=read();b[
0]=-1e9;b[m+
1]=
1e9;for(
int i=
1;i<=l;i++) c[i]=read();c[
0]=-1e9;c[l+
1]=
1e9;sort(a+
1,a+n+
1);sort(b+
1,b+m+
1);sort(c+
1,c+l+
1);if(n<=
100){for(
int i=
1;i<=n;i++
){for(
int j=
1;j<=m;j++
){for(
int k=
1;k<=l;k++
){ans=min(ans,ABS(a[i]-b[j])+ABS(b[j]-c[k])+ABS(c[k]-
a[i]));}}}}else{for(
int i=
1,p1,p2,p3,p4;i<=n;i++
){p1=lower_bound(b+
1,b+m+
1,a[i])-
b;p2=upper_bound(b+
1,b+m+
1,a[i])-
b;if(ABS(b[p1])<
1e9){p3=lower_bound(c+
1,c+l+
1,a[i])-
c;p4=upper_bound(c+
1,b+l+
1,a[i])-
c;if(ABS(c[p3])<1e9) ans=min(ans,ABS(a[i]-b[p1])+ABS(b[p1]-c[p3])+ABS(c[p3]-
a[i]));if(ABS(c[p4])<1e9) ans=min(ans,ABS(a[i]-b[p1])+ABS(b[p1]-c[p4])+ABS(c[p4]-
a[i]));}if(ABS(b[p2])<
1e9){p3=lower_bound(c+
1,c+l+
1,a[i])-
c;p4=upper_bound(c+
1,b+l+
1,a[i])-
c;if(ABS(c[p3])<1e9) ans=min(ans,ABS(a[i]-b[p2])+ABS(b[p2]-c[p3])+ABS(c[p3]-
a[i]));if(ABS(c[p4])<1e9) ans=min(ans,ABS(a[i]-b[p2])+ABS(b[p2]-c[p4])+ABS(c[p4]-
a[i]));}} }printf("%d\n",ans);return 0;
} 70分代碼(貪掛了) //100
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+
5;
int n,m,l,a[N],b[N],c[N];
int ans=
2e9;
inline int read(){int x=
0,f=
1;
char ch=
getchar();while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=
getchar();}while(ch>=
'0'&&ch<=
'9'){x=x*
10+ch-
'0';ch=
getchar();}return x*
f;
}
inline int ABS(
int x){return x>
0?x:-
x;
}
int main(){n=read();m=read();l=
read();for(
int i=
1;i<=n;i++) a[i]=
read();for(
int i=
1;i<=m;i++) b[i]=
read();for(
int i=
1;i<=l;i++) c[i]=
read();sort(a+
1,a+n+
1);sort(b+
1,b+m+
1);sort(c+
1,c+l+
1);for(
int i=
1,p1,p2,p3,p4;i<=n;i++
){p1=lower_bound(b+
1,b+m+
1,a[i])-
b;p2=lower_bound(c+
1,c+l+
1,a[i])-
c;for(
int j=
0;j<
2;j++)
for(
int k=
0;k<
2;k++
){p3=p1-j;p4=p2-
k;if(p3<
1) p3++;
if(p4<
1) p4++
;if(p3>m) p3--;
if(p4>l) p4--
;ans=min(ans,ABS(a[i]-b[p3])+ABS(b[p3]-c[p4])+ABS(c[p4]-
a[i]));}} printf("%d\n",ans);return 0;
} ?
轉(zhuǎn)載于:https://www.cnblogs.com/shenben/p/6754100.html
總結(jié)
以上是生活随笔為你收集整理的[Offer收割]编程练习赛15 A.偶像的条件[贪心]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。