bzoj 3210: 花神的浇花集会

来源:互联网 发布:complete java 编辑:程序博客网 时间:2024/04/29 12:22

题意

现在花神知道每个人的代码能力x和算法能力y,一道题(代码难度X算法难度Y)对这个人的不适合度为 Max ( abs ( X – x ) , abs ( Y – y ) )
也就是说无论太难还是太简单都会导致题目不适合做(如果全按花神本人能力设题,绝对的全场爆0的节奏,太简单,则体现不出花神的实力)
当然不是每次都如花神所愿,不一定有一道题适合所有人,所以要使所有人的不合适度总和尽可能低

题解

很明显的一个切比雪夫距离。。
然后转为曼哈顿距离
然后x和y分开考虑
取中位数就可以了

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;typedef long long LL;const LL N=100005;struct qq{    LL x,y;}s[N];LL n;bool cmpx (qq a,qq b){return a.x<b.x;}bool cmpy (qq a,qq b){return a.y<b.y;}LL get (LL x,LL y){    LL lalal=0;    for (LL u=1;u<=n;u++)        lalal=lalal+abs(x-s[u].x)+abs(y-s[u].y);    return lalal;}int main(){    scanf("%lld",&n);    for (LL u=1;u<=n;u++)    {        LL x,y;        scanf("%lld%lld",&x,&y);        s[u].x=x+y;s[u].y=x-y;    }    LL X,Y;    sort(s+1,s+1+n,cmpx);    X=s[n+1>>1].x;    sort(s+1,s+1+n,cmpy);    Y=s[n+1>>1].y;    if ((X&1)==(Y&1))   printf("%lld\n",get(X,Y)>>1);    else printf("%lld\n",min(min(get(X+1,Y),get(X-1,Y)),min(get(X,Y+1),get(X,Y-1)))>>1);    return 0;}