不難看出每個油井的 \(x\) 座標是沒用的,所以問題轉化為如下。
代數意義:給出 \(n\) 個數 \(y_1,y_2,\ldots,y_n\),找乙個數 \(a\),使得 \(\sum_^n |a-y_i|\) 最小。
幾何意義:數軸上有 \(n\) 個點 \(y_1,y_2,\ldots,y_n\),在數軸上放置乙個點 \(a\),使得線段 \(ay_1,ay_2,\ldots,ay_n\) 長度之和最小。
為便於說明,假設 \(y_1,y_2,\ldots,y_n\) 從小到大有序。
如果從代數意義著手,你會發現式子裡既有絕對值又有和式,很難找到思路,所以應該從幾何意義著手。
當 \(n\) 為偶數時,\(a\) 放在最中間兩個點之間是最優的,證明如下:首先只考慮\(y_1\) 和 \(y_n\) 兩個點,則點 \(a\) 應放在 \(y_1\) 和 \(y_n\)中間。接著再把點 \(y_2\) 和點 \(y_\) 納入考慮,顯然 \(a\) 應該放在 \(y_2\) 和 \(y_\) 中間(此時 \(a\) 同樣也在 \(y_1\) 和 \(y_n\) 中間)……依此類推即可得出結論。
當 \(n\) 為奇數時,\(a\) 放在中間那個點上是最優的,證明方法同上。
統一處理:取 \(y_\rfloor}\) 作為 \(a\),或者取中位數也行。可以直接排個序取中間,也可以按快排的思想用分治法求,反正都能過。
#include #include #include #include using namespace std;
const int maxn = 10000 + 5;
int arr[maxn];
int solve(int n)
int main()
printf("%d", solve(n));
return 0;
}
P1862輸油管道問題
p1862輸油管道問題 影象大體是這樣,是帶權平均數問題,設答案是k,sigama abs yi k wi 最小,這裡的wi是1而已,問題就退化成了中位數。按縱座標排序,求中位數即可。1 include2 include3 include4 include5 include6 include7 in...
輸油管道問題
某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n 口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n 口油井的位置,即它們的x 座標 東西向 和y 座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?1 ...
輸油管道問題
某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n口油井的位置,即它們的x座標 東西向 和y座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?給定n口油井...