nyoj7 街區最短路徑問題

2021-07-02 03:07:05 字數 1321 閱讀 7493

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4 描述

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

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

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

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

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

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

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

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

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

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

思路:兩點之間線段最短

當給定兩個點a b  

此時我們只考慮乙個座標僅僅在x軸,如果 a=1,b=20; 那麼只有當第三個點c在 a與b之間時,距離是最短的,此時最短距離為b-a。

如果此時有四個頂點 a=1 b=8 c=4 d=20 求e,到各個頂點的最短距離怎麼算呢??

是不是我們把座標都給畫出來了?從左到右依次是:acbd ,

此時我們撇開 c b 考慮a d 是不是發現 e 只要在a d中間就行了?那e與ad兩個頂點的最短距離是不是d-a?

在考慮c b  只要滿足 e點在c b之間就可以了? 那e與 c  b兩個頂點的最短距離是不是 c-b? 

最短距離是不是:d-a+c-b

特別說明:

由於本題只考慮東西南北四個方向走,也就是不允許斜著走!!所以是不是我們可以把本題中的橫縱座標分開呢??答案是:可以!

這時候我們就發現了:

1.我們只需要兩個陣列分別儲存橫座標與縱座標

2.對陣列排序

3.計算出橫縱座標最短距離之和

**如下:

#include#includeint cmp(const void *a,const void *b)

int main()

{ int n;

scanf("%d",&n);

while(n--)

{ int min=0,m,i,x[20],y[20];//陣列x與陣列y分別儲存橫縱座標

scanf("%d",&m);

for(i=0;i!=m;i++)

scanf("%d %d",&x[i],&y[i]);

qsort(x,m,sizeof(int),cmp);//快排從小到大

qsort(y,m,sizeof(int),cmp);

for(i=0;i

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個街道。現在要建乙個郵局,使...