hdu4311 n个平面点选取一个使距离该点曼哈顿距离最小 枚举/快速计算曼哈顿距离
这个题目和前几天做acdream的那个题目类似,可以说是加强版
那个题目是一维点,那个题目其实只用看中间两个点,我当时做的时候就是枚举n个点,然后累加累减距离达到快速计算其他点到该点距离
本题完全可以利用这个分开计算其他点到这个点x轴向与y轴向距离和
记录id,两次排序,然后累加累减距离,最后选取n个点x轴向和y轴向距离和最小的点
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian{ 6 long long x,y,id; 7 }a[100005],f[100005]; 8 int cmp1(dian n1,dian n2) 9 { 10 return n1.y<n2.y; 11 } 12 int cmp2(dian n1,dian n2) 13 { 14 return n1.x<n2.x; 15 } 16 int main() 17 { 18 int T; 19 long long n,i,tmp,minx; 20 scanf("%d",&T); 21 while (T--) 22 { 23 scanf("%lld",&n); 24 for (i=1;i<=n;i++) 25 { 26 scanf("%lld%lld",&a[i].x,&a[i].y); 27 a[i].id=i; 28 } 29 sort(a+1,a+n+1,cmp1); 30 tmp=0; 31 for (i=2;i<=n;i++) tmp+=a[i].y-a[1].y; 32 f[a[1].id].x=tmp; 33 for (i=2;i<=n;i++) 34 { 35 tmp+=(i-1)*(a[i].y-a[i-1].y); 36 if (i!=n) tmp-=(n-i+1)*(a[i].y-a[i-1].y); 37 f[a[i].id].x=tmp; 38 } 39 sort(a+1,a+n+1,cmp2); 40 tmp=0; 41 for (i=2;i<=n;i++) tmp+=a[i].x-a[1].x; 42 f[a[1].id].y=tmp; 43 for (i=2;i<=n;i++) 44 { 45 tmp+=(i-1)*(a[i].x-a[i-1].x); 46 if (i!=n) tmp-=(n-i+1)*(a[i].x-a[i-1].x); 47 f[a[i].id].y=tmp; 48 } 49 minx=f[1].x+f[1].y; 50 for (i=2;i<=n;i++) 51 minx=min(minx,f[i].x+f[i].y); 52 printf("%lld\n",minx); 53 } 54 }