ACM 街區最短路徑問題

2021-08-18 00:17:48 字數 1208 閱讀 6896

南陽理工acm pro.7:

時間限制:

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

分析: 郵局可與住戶重合;

只能走直線,不能走斜線;所以兩點之間的距離為 | x[1]-x[2] | + | y[1] -y[2]|

找出中心點,將二維座標先換為一維座標,分別求出sum[x]、sum[y]。所以住戶到郵局的最短路徑之和為:

sum=sum[x] + sum[y]

=σ(| x[i]-x |)+ σ(| y[i]-y |)

(一維)假設有六個點x[0-5](按公升序排序), 設b點為到所有點距離之和最小的點,因為要求最短距離,b點一定在x[0]-x[5]之間,則所有點到b點的距離之和為:

sum=|x[0]-b|+|x[5]-b|  +  |x[1]-b|+|x[4]-b|   + |x[2]-b|+|x[3]-b| 

**:

#include#include#includeusing namespace std;

int x[21], y[21];

int main()

{ int test, m, i, sum;

scanf("%d", &test);

while (test--)

{ sum = 0;

scanf("%d", &m);

for (i = 0; i

acm 街區最短路徑問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使...

街區最短路徑問題

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

街區最短路徑問題

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