D. Office Keys
题意
在x轴上,给出n个人初始位置, 以及k把钥匙,和集合位置,每个人要拿一把钥匙然后到集合位置,要使这n个人中需要走的距离中最大的一个最小(每种情况最大值中求个最小),求出最小值
( 1 ≤ n ≤ 1 000, n ≤ k ≤ 2 000, 1 ≤ p ≤ 1e9 )
分析
结论:最优情况下,选择的n把钥匙肯定是连续的n把
证明:画下钥匙和人以及集合位置的位置关系结论很显然
直接枚举钥匙起点的时间复杂度为O(n^2)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1000+10; const int N = 1e6+5; int n,k; int p[maxn],key[maxn*2],office; int main() { scanf("%d%d%d", &n, &k, &office); for(int i=1;i<=n;i++) { scanf("%d", &p[i]); } for(int i=1;i<=k;i++) { scanf("%d", &key[i]); } sort(p+1, p+n+1); sort(key+1,key+k+1); ll answer=10000000000000; for(int i=1;i<=k-n+1;i++) { ll ans=0; for(int j=1;j<=n;j++) { ans=max(ans,1ll*(abs(key[j+i-1]-p[j])+abs(key[i+j-1]-office))); } answer=min(answer, ans); } printf("%lld ", answer); return 0; }