題目7 街區最短路徑問題

2021-08-07 08:19:27 字數 1470 閱讀 1177

描述

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

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

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

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

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

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

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

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

每組第一行乙個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0 < x,y < 100,表示某個使用者所在街區的座標。

m行後是新一組的資料;

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

樣例輸入

2

31 1

2 11 2

52 9

5 20

11 9

1 11 20

樣例輸出

2

44

這個題目的特點是要對蠻力法進行優化。

演算法思想:

可以先對x軸進行遍歷,從1到100的每個橫座標點到輸入點(x,y)的橫座標的距離和的最小值記為xmin;

同理,然後對y軸進行遍歷,從1到100的每個縱座標點到輸入點(x,y)的縱座標的距離和的最小值記為ymin;

求sum = xmin + ymin即為最小距離和。

演算法複雜度:o(m*n),迴圈次數最多為100*20.

源**:

#include 

#include

#include

using

namespace

std;

#define maxnum 1000000

typedef

struct nodenode,*pnode;

int main()

for (int i = 1; i <= 100; i++)

// cout << sum << " ";

}// cout << "xmin = " << xmin << endl;

sum = maxnum;

for (int i = 1; i <= 100; i++)

}// cout << "ymin = " << ymin << endl;

cout

<< xmin + ymin << endl;

}return

0;}

最優**:

#include

#include

using

namespace

std;

int x[30],y[30],n,m,i;;

int main()

題目7 街區最短路徑問題

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

NYOJ 題目7街區最短路徑

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

南陽 7 街區最短路徑問題

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