演算法 輸油管道問題

2021-09-01 20:37:40 字數 1108 閱讀 4358

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

程式設計任務:

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

輸入格式

由檔案input.txt提供輸入資料。

檔案的第1行是油井數n,1≤n≤10000。

接下來n行是油井的位置,每行2個整數x和y,-10000≤x,y≤10000。

輸出格式

程式執行結束時,將計算結果輸出到檔案output.txt中。檔案的第1行中的數是油井到主管道之間的輸油管道最小長度總和。

樣例輸入5

1 2

2 2

1 3

3 -2

3 3樣例輸出

6如果有兩口油井,取兩口油井南北方向之間的任意位置,如果有三口油井,則取其中位數。 用分治的思想求中位數。然後用每乙個油井的位置減去中位數,的最短距離。

#include#includeusing namespace std;

#define n 10010

int a[n];

void swap(int i,int j)

int searchmid(int l,int r,int x)}}

if(n+1==x) return a[l];

else if(n+1else searchmid(l+1,i-1,x);

}int main()

fscanf(fp_in,"%d",&n);

//x座標無用,將y存入陣列

for(int i=0; imid=searchmid(0,n-1,n/2+1);

for(int i=0; isum+=abs(a[i]-mid);

cout

}

輸油管道問題

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

輸油管道問題

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

輸油管道問題

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