時間限制:3000 ms | 記憶體限制:65535 kb
難度:4
描述 乙個街區有很多住戶,街區的街道只能為東西、南北兩種方向。
住戶只可以沿著街道行走。
各個街道之間的間隔相等。
用(x,y)來表示住戶坐在的街區。
例如(4,20),表示使用者在東西方向第4個街道,南北方向第20個街道。
現在要建乙個郵局,使得各個住戶到郵局的距離之和最少。
求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;
輸入第一行乙個整數n<20,表示有n組測試資料,下面是n組資料;
每組第一行乙個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0
輸出每組資料輸出到郵局最小的距離和,回車結束;
樣例輸入
231 1
2 11 2
52 9
5 20
11 9
1 11 20
樣例輸出
244
我剛開始用的窮舉法,將郵局的每種可能座標都列舉出來,然後算它到各個住戶的距離總和,最後找出最小值。程式如下:
/* 街區最短路徑問題 */
/* 採用窮舉法,找出最小距離之和並輸出 */
/* 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.對於編號相等的長方形,按照長方形的長...