题意:n,k,p,一个横坐标轴,输入n个人的位置,K个钥匙的位置,给出办公室的位置,问每个人都拿到钥匙到办公室的最短时间是多少。
思路:我们可以二分时间,那怎么判断是否可以在该时间都到达,对N,K排序,对于第一个钥匙 ,abs(人[i]-钥匙[1])+abs(钥匙[1]-p),后面是不变的,如果某个人可以通过该钥匙到达,那么后面的人用该钥匙距离肯定更长,如果没人能用这把钥匙,换第二把钥匙。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=2002; 5 6 ll a[N],b[N]; 7 ll n,k,p; 8 9 int check(ll x){ 10 for(int i=1,j=1;i<=n;i++,j++){ 11 while(j<=k&&(abs(a[i]-b[j])+abs(p-b[j]))>x) j++; 12 if(j>k) return 0; 13 } 14 return 1; 15 } 16 int main(){ 17 cin>>n>>k>>p; 18 for(int i=1;i<=n;i++){ 19 scanf("%d",&a[i]); 20 } 21 for(int i=1;i<=k;i++){ 22 scanf("%d",&b[i]); 23 } 24 sort(a+1,a+1+n); 25 sort(b+1,b+1+k); 26 ll l=0,r=1e18,mid,ans=r; 27 while(l<=r){ 28 mid=(l+r)>>1; 29 if(check(mid)) { 30 ans=mid;r=mid-1; 31 } 32 else l=mid+1; 33 } 34 cout<<ans<<endl; 35 }