輸油管道問題

2021-09-29 01:43:30 字數 1691 閱讀 7163

某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n口油井的油田。從每口油井都要有一條輸油管道沿最短路經(或南或北)與主管道相連。

如果給定n口油井的位置,即它們的x座標(東西向)和y座標(南北向),應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?

給定n口油井的位置,程式設計計算各油井到主管道之間的輸油管道最小長度總和。

輸入第1行是乙個整數n,表示油井的數量(1≤n≤10 000)。

接下來n行是油井的位置,每行兩個整數x和y

(﹣10 000≤x,y≤10 000)。

輸出各油井到主管道之間的輸油管道最小長度總和。

設n口油井的位置分別為 pi=(xi,.yi)

i=1~n。由於主輸油管道是東西向的,因此可用其主軸線的y座標唯一確定其位置。

主管道的最優位置y應該滿足:

由中位數定理可知,y是中位數。

奇數點情況

直線位於a2.y時,距離和d=|a3.y|+|a1.y|(假設a2.y=0),

當直線偏離a2,位於a1-a2間時,距離和d=|a3.y|+|a1.y|+d,d為a2偏移量。

也能說明只有直線位於中位數字置時,距離和最短,是我們要找的位置。

偶數點情況

當直線在a2-a3之間的時候,距離和d=|a3.y|+|a2.y|+|a4.y|+|a1.y|,

當直線在別的位置比如a1-a2時,距離和d=(a3-a2)+(a4-a1)+d,其中d為偏移量。我們會發現只有直線位置屬於[a2,a3]時,距離和才會最小,而且在[a2,a3]任意位置,距離和都是固定的。

所以沒有必要將直線取值在a2和a3的正中間,取a2和a3能有相同的效果,相當於a2和a3中間位置取整,這就說明找到n個點的中位數即可。

對陣列a排序

int n; //油井的數量

int x; //x座標,讀取後丟棄

int a[1000]; //y座標

cin>>n;

for(int k=0;k>x>>a[k];

sort(a,a+n); //按公升序排序

//計算各油井到主管道之間的輸油管道最小長度總和

int min=0;

for(int i=0;i採用分治求中位數

int n; //油井的數量

int x; //x座標,讀取後丟棄

int a[1000]; //y座標

cin>>n;

for (int i=0; i>x>>a[i];

int y = select(0, n-1, n/2); //採用分治演算法計算中位數。快速排序中的分割演算法

//計算各油井到主管道之間的輸油管道最小長度總和

int min=0;

for(int i=0;i

min += (int)fabs(a[i]-y);

cout<

輸油管道問題

某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n 口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n 口油井的位置,即它們的x 座標 東西向 和y 座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?1 ...

輸油管道問題

根據中位數定理,要使總和距離最小,應該選擇中位數作為目標點。因此解決此問題的方法就是將各個油井投影到y軸,找到y座標的中位數即可。解題思路 要找出乙個數的中位數,最簡單的方法就是對陣列進行排序,但是快速排序的時間複雜度也需要o nlogn 對與有序陣列a n 如果陣列是奇數個,中位數就是a n 2 ...

演算法 輸油管道問題

問題描述 某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n 口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n口油井的位置,即它們的x 座標 東西向 和y 座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位...