Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)D. Office Keys

题意: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 }

 

posted on 2017-07-14 16:38  hhhhx  阅读(147)  评论(0编辑  收藏  举报

导航