nyoj7 街區最短路徑問題

2022-09-15 08:57:10 字數 1653 閱讀 7400

時間限制: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 座標和 y 座標分開,這樣問題就變成了,給你 m 個數,求這些數每個減去乙個 x 的絕對值之和的最小值,

min(∑|ai-x|)。

誤區:min(∑|ai-x|) != min |∑ai-m*x|。

也可以求中位數

我的**:

view code

1 #include

2using

namespace std;

3struct ssa[20];45

int abs(int a)

6 10

11int main()

12 29

for(i=xmin;i<=xmax;i++)

30

36if(xans>xt)

37 xans=xt;

38 }

39for(i=ymin;i<=ymax;i++)

40

46if(yans>yt)

47 yans=yt;

48 }

49 cout<50 }

51return

0;52 }

還有一種更簡單的方法:給你 n 個數 a[1]、a[2]、……、a[n]; 求 min(∑|a[i]-x|) 

首先 把這 n 數進行排序 ans = ∑ (a[n-i]-a[i])  1<=i<=n/2;  其實就是在乙個座標軸上有 n 個點 求乙個點到所以點的最短距離和 ,由於任意兩點 x1 、x2,要使

的距離和最小 則  x 必須在 x1  x2 之間就行了,所以 n 個頂點排完序後 只要把 x 放在這 n 個數之間就行了

view code

1 #include

2 #include

3 #include

4using

namespace std;

5const

int max=30;

6int xx[max],yy[max];

7int main()

8 24 }

NYOJ 7 街區最短路徑問題

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

NYOJ 7 街區最短路徑問題

include include includeint a 30 b 30 c 110 110 c1 110 110 e 30 f 30 a陣列存的是橫座標 b陣列存的是縱座標 因為要對a和b陣列排序 所以有新增兩個陣列e和f儲存未排序時的a與b陣列 c陣列是乙個矩陣 c1陣列是來記錄該位置是否被訪問...

NYOJ 7 街區最短路徑問題

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