開開心心學演算法 街區最短路徑問題的二種解法

2021-08-27 04:30:16 字數 1506 閱讀 7462

時間限制: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

我剛開始用的窮舉法,將郵局的每種可能座標都列舉出來,然後算它到各個住戶的距離總和,最後找出最小值。程式如下:

/*	街區最短路徑問題                      */

/* 採用窮舉法,找出最小距離之和並輸出 */

/* 2012.8.1 */

#include int abs(int a) //求絕對值

int main()

printf("%d\n",min_path);

} return 1;

}

但是這種方法的效率太差了,時間40,記憶體228。

於是我又用了另一種解法,程式如下:

/*	街區最短路徑問題                      */

/* 找出最小距離之和並輸出 */

/* 2012.8.1 */

#include #include int comp(const void *p,const void *q)

int main()

{ int n,m,i,x[20],y[20];

int min_path;

scanf("%d",&n);

while(n--)

{ min_path=0;

scanf("%d",&m);

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

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

qsort(x,m,sizeof(int),comp);//將x陣列公升序排序

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

for(i=0;i

這種方法效率高多了。時間4,記憶體228。

收穫:學會了qsort的應用,其實在c++中還有個sort更好。學會用數學的方式去解題。

開開心心學演算法 排序演算法

歸併排序 快速排序 堆排序思路 對於乙個序列為1,a2,an 的序列而言,1 是有序序列,而2,an 為待排序序列 那麼先抽出a2,讓key a2,這一步的目的是防止當a1往後移動的時候a2被覆蓋掉 然後讓a1與a2比較,如果a1 a2,則保持a2的位置不變 否則將a1向後移動一位,那麼此時a1就在...

開開心心學演算法 噴水裝置(一)

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0 輸入第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共有n個噴水裝置,...

開開心心學演算法 一種排序

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複 還知道這個長方形的寬和長,編號 長 寬都是整數 現在要求按照一下方式排序 預設排序規則都是從小到大 1.按照編號從小到大排序 2.對於編號相等的長方形,按照長方形的長...