NYOJ 題目7街區最短路徑

2021-08-15 17:20:44 字數 1125 閱讀 6880

時間限制:

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

一看到最短路徑,我就覺得是弗洛伊德或者迪傑斯特拉的演算法

仔細一看,好像不對啊,又腦洞大開想到了多邊形重心……但是應該也不對,

後來找答案,有暴力方法就是列舉橫豎100*100個點看哪個點最小,

更主流的方法是:設使各個點到(x,y)的距離和最小

那麼sum = |所有點的橫座標-x的絕對值|求和  + |所有點的縱座標 - y |求和

假設有已經排序了的5個點

已知 |x5-x1| = |x1-x|+|x5-x|  x為中點橫座標

所以sum = x5-x1+x4-x2+x3-x3

所以**就是醬嬸兒的

#include#include#includeusing namespace std;

const int max = 25;

int a[max];

int b[max];

int c[max];

int abss(int x)

int main()

sort(a,a+m);

sort(b,b+m);

int sum=0;

for(int j=0;j

nyoj 7 街區最短路徑

include include using namespace std int cmp int a,int b if m 2 0 sum1 sum1 midx sort y,y m,cmp midy y m 2 for i 0 i m i if m 2 0 sum2 sum2 midy printf...

題目7 街區最短路徑問題

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

題目7 街區最短路徑問題

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