NYOJ:街區最短路徑問題(曼哈頓距離)
阿新 • • 發佈:2018-11-26
描述
一個街區有很多住戶,街區的街道只能為東西、南北兩種方向。
住戶只可以沿著街道行走。
各個街道之間的間隔相等。
用(x,y)來表示住戶坐在的街區。
例如(4,20),表示使用者在東西方向第4個街道,南北方向第20個街道。
現在要建一個郵局,使得各個住戶到郵局的距離之和最少。
求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;
輸入
第一行一個整數n<20,表示有n組測試資料,下面是n組資料;
每組第一行一個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0<x,y<100,表示某個使用者所在街區的座標。
m行後是新一組的資料;
輸出
每組資料輸出到郵局最小的距離和,回車結束;
樣例輸入
2 3 1 1 2 1 1 2 5 2 9 5 20 11 9 1 1 1 20
樣例輸出
2 44
看過曼哈頓距離的人應該知道在兩個點之間的最短距離是確定的。
如果兩個點座標為x1,y1,x2,y2,那他們之間的最短距離為
abs(x1-x2)+abs(y1-y2)。
這樣就可以把所有的點先排個序,用最大的減最小的,次大的減次小的,直到最後。
#include<stdio.h> #include<algorithm> #define N 120 using namespace std; int a[N],b[N]; int main() { int n,m,i,ans; scanf("%d",&n); while(n--) { scanf("%d",&m); for(i=0;i<m;i++) scanf("%d%d",&a[i],&b[i]); sort(a,a+m); sort(b,b+m); ans=0; for(i=0;i<m/2;i++) ans+=(a[m-i-1]-a[i])+(b[m-i-1]-b[i]); printf("%d\n",ans); } return 0; }