【問題描述】
在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用x座標表示東西向,用y座標表示南北向。各居民點的位置可以由座標(x,y)表示。要求:為建郵局選址,使得n個居民點到郵局之距離的總和最小。以檔案輸入形式進行測試。
【思路】
運用分治思想。將居民點的座標從輸入檔案中獲取到並且存入兩個一維陣列x和y中。利用快速排序分別將兩個陣列進行排序,排序的時候是確定乙個主元,把陣列分成大於主元和小於主元的兩個部分,然後分別遞迴呼叫快排的方法進行排序,一直到有序,這就運用到了分治的思想。分別取排好序的兩個陣列的中位數,然後用陣列的每乙個元素減去中位數取絕對值再相加得到最短距離。
【執行環境】codeblocks
【程式語言】c++
【執行過程】
首先,將輸入資料分七組填入input_assign01_01-input_assign01_07檔案中。
其次,在codeblocks中編譯執行該程式,程式讀取到每個輸入檔案的內容。
最後,按程式中的輸出格式按每組測試資料將每個檔案中的居民點到郵局的最短距離顯示出來。
【測試資料】
【源**】
#include#include#include #include#include using namespace std;
int n; //n是居民點的個數
int x[1000]; //居民點的x座標陣列
int y[1000]; //居民點的y座標陣列
void input(string fn) //輸入資料檔案函式
fin.close(); //檔案讀取完之後關閉檔案
}int divide(int m, int left, int right) //left為陣列第乙個元素,right是陣列最後乙個元素
}//迴圈結束後下標為從left到i(包括i)的數都是小於x的數,接下來將主元和i+1位置上面的數進行交換
m[right] = m[i + 1];
m[i + 1] = x;
return i + 1;
}void qsort(int a, int left, int right) //運用分治思想
}void getminsumdistance(int *x,int *y,int n) //求距離總和最小值
{ int dx; //x座標中位數
int dy; //y座標中位數
int distance=0; //n個居民點到該郵局的距離的總和
qsort(x,0,n-1);
qsort(y,0,n-1);
dx=x[n/2]; //求x座標中位數
dy=y[n/2]; //求y座標中位數
for(int i=0;i【執行結果】
郵局選址問題
在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用 x 座標表示東西向,用 y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局的...
郵局選址問題
描述 在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用x 座標表示東西向,用y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局...
動態規劃 郵局選址問題
題目 有一條公路經過 個村莊,每乙個村莊都處在整數的座標點上 這裡假設公路為數軸 規劃在這條公路上建立 個郵局,每乙個郵局都要建在某個村莊上,要求讓不同村莊的人到郵局要走的總路程最小。分析 用動態規劃的辦法,先把輸入的村莊排序,然後計算只有乙個郵局的情況,然後再根據已有的資訊,計算p p 2 個郵局...