题意:
有两题就不写了,挺好的懂得。
题解:
这两题差不多。
将切比雪夫距离转成曼哈顿距离就很好做了。
3210要注意转回来是小数的情况,所以要枚举周围四个点。
code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
int n,X[M],Y[M];
long long Check(int x,int y)
{
int i;
long long re=0;
for(i=1;i<=n;i++)
re+=abs(x-X[i])+abs(y-Y[i]);
return re;
}
int main()
{
int i,x,y;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
X[i]=x+y;Y[i]=x-y;
}
sort(X+1,X+n+1);
sort(Y+1,Y+n+1);
x=X[n+1>>1];
y=Y[n+1>>1];
if( ~(x^y)&1 )
cout<<Check(x,y)/2<<endl;
else
cout<<min(min(Check(x+1,y),Check(x-1,y)),min(Check(x,y+1),Check(x,y-1)))/2<<endl;
return 0;
}
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
struct node{
LL x,y,num;
}a[100010];
LL n,X[100010],Y[100010];
bool cmp_x(node a,node b) {return a.x<b.x;}
bool cmp_y(node a,node b) {return a.y<b.y;}
int main()
{
scanf("%lld",&n);
for(LL i=1;i<=n;i++)
{
LL x,y;scanf("%lld %lld",&x,&y);
a[i].x=x-y;a[i].y=x+y;a[i].num=i;
}
sort(a+1,a+n+1,cmp_x);
LL sum=0;
for(LL i=1;i<=n;i++) sum+=(a[i].x-a[1].x);
X[a[1].num]=sum;
for(LL i=2;i<=n;i++)
{
sum+=(i-1)*(a[i].x-a[i-1].x);
sum-=(n-i+1)*(a[i].x-a[i-1].x);
X[a[i].num]=sum;
}
sort(a+1,a+n+1,cmp_y);
sum=0;
for(LL i=1;i<=n;i++) sum+=(a[i].y-a[1].y);
Y[a[1].num]=sum;
for(LL i=2;i<=n;i++)
{
sum+=(i-1)*(a[i].y-a[i-1].y);
sum-=(n-i+1)*(a[i].y-a[i-1].y);
Y[a[i].num]=sum;
}
LL ans=1LL<<60;
for(LL i=1;i<=n;i++) ans=min(ans,X[i]+Y[i]);
printf("%lld",ans/2);
}