置頂 街區最短路徑問題 ny 7

2021-06-23 00:25:58 字數 1326 閱讀 9676

街區最短路徑問題

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:4

描述

乙個街區有很多住戶,街區的街道只能為東西、南北兩種方向。

住戶只可以沿著街道行走。

各個街道之間的間隔相等。

用(x,y)來表示住戶坐在的街區。

例如(4,20),表示使用者在東西方向第4個街道,南北方向第20個街道。

現在要建乙個郵局,使得各個住戶到郵局的距離之和最少。

求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;

輸入

第一行乙個整數n<20,表示有n組測試資料,下面是n組資料;

每組第一行乙個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0輸出

每組資料輸出到郵局最小的距離和,回車結束;

樣例輸入2

31 1

2 11 2

52 9

5 20

11 9

1 11 20

樣例輸出2

44 解題思路:

1、  求最短路徑,可以把資料分成兩組,乙個東西街道,乙個南北街道。

2、  分別找兩個陣列的中位數。

3、  每個資料到中位數的距離和,就是最短路徑之和。

程式**:

#include

#include

#include

int cmp(const void *a,const void *b)

return *(int*)a - *(int*)b;

int main()

int x[110],y[110],n,m,i,j,s;

while(scanf("%d",&n)!=eof)

while(n--)

scanf("%d",&m);

for(i=0;iscanf("%d %d",&x[i],&y[i]);

qsort(x,m,sizeof(x[0]),cmp);          // 排序

qsort(y,m,sizeof(y[0]),cmp);

// for(i=0; i// printf("%d ",x[i]);

s=0;

for(i=0; is=s+fabs(x[i]-x[m/2])+fabs(y[i]-y[m/2]);               //找出中位數,然後到中位數的距離之和

printf("%d\n",s);

return 0;

南陽 7 街區最短路徑問題

解題思路 題意很明確,關鍵就是求郵局的位置,由於所有住戶座標到該點的距離和最短,其實就是縱橫座標 中位數。即先排序,然後計算中位數的序號。接著就容易求出各個住戶到郵局的距離之和即可 演算法 n 個數 a 1 a 2 a n 求 min a i x 首先 把這 n 數進行排序 ans a n i a ...

題目7 街區最短路徑問題

描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使得各個住戶到郵局的距離之和最少。求現在這個郵局應該建在那個地方使得...

題目7 街區最短路徑問題

描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使得各個住戶到郵局的距離之和最少。求現在這個郵局應該建在那個地方使得...