这道题表面上很简单,但并非非常水,还是要经过一些思考的。。。这道题意思很简单,不说了。拿到这道题后,目测可能跟贪心有关,果断就要排序。把x,y分开处理,这样才能下手。首先是对x进行排序,计算每个点在x坐标中,其他点到该店的距离之和,记作dx(i)。怎么计算,排序后用sum数组计算前i个坐标的x坐标和,然后在借助它在计算dx(i)。x方向处理完,在按照这样处理y方向,最终结果=min{dx(i)+dy(i)},注意数据类型。。。要用int64,坑爹的3个WA。。。。附代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct point
{
__int64 x;
__int64 y;
__int64 dx;
__int64 dy;
};
#define clear(a) memset(a,0,sizeof(a))
const int N=100100;
const __int64 Max=0x3f3f3f3f3f3f3f3fLL;
point a[N];
__int64 sumx[N],sumy[N];
bool cmp1(point p,point q)
{
if (p.x>q.x) return 0;
else return 1;
}
bool cmp2(point p,point q)
{
if (p.y>q.y) return 0;
else return 1;
}
int main()
{
int i,j,n,T;
__int64 mmin,k;
scanf("%d",&T);
while (T>0)
{
mmin=Max;
scanf("%d",&n);
clear(sumx);
clear(sumy);
for (i=1;i<=n;i++)
{
a[i].x=a[i].y=a[i].dx=a[i].dy=0;
}
for (i=1;i<=n;i++)
scanf("%I64d%I64d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp1);
sumx[0]=0;
for (i=1;i<=n;i++) sumx[i]=sumx[i-1]+a[i].x;
for (i=1;i<=n;i++)
a[i].dx=(i-1)*a[i].x-sumx[i-1]+(sumx[n]-sumx[i])-(n-i)*a[i].x;
sort(a+1,a+n+1,cmp2);
sumy[0]=0;
for (i=0;i<=n;i++) sumy[i]=sumy[i-1]+a[i].y;
for (i=1;i<=n;i++)
{
a[i].dy=(i-1)*a[i].y-sumy[i-1]+(sumy[n]-sumy[i])-(n-i)*a[i].y;
k=a[i].dy+a[i].dx;
if (k<mmin) mmin=k;
}
printf("%I64d\n",mmin);
T--;
}
return 0;
}