Codeforces Round #424

D. Office Keys

题意

在x轴上,给出n个人初始位置, 以及k把钥匙,和集合位置,每个人要拿一把钥匙然后到集合位置,要使这n个人中需要走的距离中最大的一个最小(每种情况最大值中求个最小),求出最小值

 ( 1 ≤ n ≤ 1 000, n ≤ k ≤ 2 000, 1 ≤ p ≤ 1e9 )

分析

结论:最优情况下,选择的n把钥匙肯定是连续的n把

证明:画下钥匙和人以及集合位置的位置关系结论很显然

直接枚举钥匙起点的时间复杂度为O(n^2)

#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;
}
View Code

 


要么优秀要么生锈
原文地址:https://www.cnblogs.com/Superwalker/p/7887235.html