龐果網之建立訊號基站

2021-08-27 15:29:33 字數 4000 閱讀 7569

題目詳情

要建立乙個訊號基站服務n個村莊,這n個村莊用平面上的n個點表示。假設基站建立的位置在(x,y),則它對某個村莊(x,y)的距離為max, 其中| |表示絕對值,我們的目標是讓所有村莊到訊號基站的距離和最小。

基站可以建立在任何實數座標位置上,也可以與某村莊重合。

輸入

給定每個村莊的位置x,y,x,y都是整數,滿足:

-1000000000 < x,y < 1000000000

村莊個數大於1,小於101。

輸出

所有村莊到訊號基站的距離和的最小值。

關於精度:

因為輸出是double。我們這樣判斷對錯,如果標準答案是a,你的答案是a,如果|a – a| < 1e-3 我們認為是正確的,否則認為是錯誤的。

樣例

假設有4個村莊位置分別為 (1,4) (2,3) (0,1) (1,1)

我們的結果是5。因為我們可以選擇(1.5,2.5)來建立訊號基站。

bestdistance = max(|1.5-1|, |2.5-4|) + max(|1.5-2|,|2.5-3|) + max(|1.5-0|,|2.5-1|) + max(|1.5-1|,|2.5-1|)

= max(0.5, 1.5) + max(0.5,0.5) + max(1.5,1.5) + max(0.5,1.5)

= 1.5 + 0.5 + 1.5 + 1.5

= 5

/*********************************

* 日期:2013-11-14

* 題號: 題目 建立訊號基站

* 結果:ac

* 總結:

**********************************/

#include#include#includeusing namespace std;

double bestdistance(int n, const int *x, const int *y)

//排序(從小到大)

for(i = 0;i < n - 1;i++)}}

for(i = 0;i < n - 1;i++)}}

index = n / 2 - 1;

for(i = 0;i <= index;i++)

//判斷n奇偶性

if(n % 2 == 0)

else

for(i = index;i <= n-1;i++)

result = (min3 - min1 + min4 - min2) / 2.0;

return result;

}int main()

printf("%lf\n",bestdistance(n,x,y));

}*/int x = ;

int y = ;

int n = 19;

printf("%lf\n",bestdistance(n,x,y));

return 0;

}

【解析】:

解題的關鍵在於如何處理max,可以通過分段函式討論來證明,max,等價於(|x1+y1-x2-y2|+|x1-y1-(x2-y2)|)/2;

假設訊號基站的座標是(x , y),那麼他與其他座標的距離為max =(|x+y-x1-y1|+|x-y-(x1-y1)|)/2, ……,(|x+y-xn-yn|+|x-y-(xn-yn)|)/2;也就是最短距離

bestdistance = 1/2 *(|x+y-(x1+y1)| + |x-y-(x1-y1)| +|x+y-(x2+y2)| + |x-y-(x2-y2)| +……+ |x+y-(xn+yn)|+|x-y-(xn-yn)|) --(1-1)

其中,x1+y1 、x1

-y1、x

2+y2 、x2-y

2 、……、xn

+yn 、xn

-yn均為常數, 通過題目所給的陣列可以容易得到這些值

假設 u(x, y) = x + y , v(x, y) = x - y ;可以得到

bestdistance =1/2 *(|u - u1| +|v - v1| +|u - u2| +|v - v2| + ……+|u - un| +|v - vn|) --(1 - 2)

=1/2 *【(|u - u1| +|u - u2|+ ……+|u - un|)+ (|v - v1| +|v - v2| + ……+|u - un| +|v - vn|) 】

這樣,就轉換為求函式y = |x - x1| + |x - x2| + |x - x3| + ……+ |x - xn|的最小值的問題,也許有人會問,公式(1 - 2)有兩個變數u , v,而函式y只有乙個變數x,其實很好辦,就將公式(1 - 2)按照變數uv分為兩部分,分別求最小值,和起來也肯定是最小值;

對於函式y = |x - x1| + |x - x2| + |x - x3| + ……+ |x - xn| (x1 , x2, ……xn是從小到大排列)的最小值;可以用數學歸納法求解:

證明:假設n = 2,則 y =|x - x1| + |x - x2|,假設x1

2,當x ≤x1

2時,y = x1 + x2 - 2x , ymin= x2- x1; 當x1

2時,y = x2 - x1 ,則ymin= x2 - x1; 當 x≥ x2 時,y = 2x - x1 - x2, ymin= x2 - x1;

若 n >2 ,

當x < x1 < x2 <……< xn時,y = (x1 - x) + (x2 - x) +…… +(xn- x) = (x1 + x2 + x3 +……+ xn) - n * x;

當x1 < x< x2 <……< xn時,y = (x1 + x2 + x3 + …… + xn) - n * x + 2(x - x1);

當x1n時,y =(x1 + x2 + x3 + …… + xn) - n * x + 2[(x - x1) + (x - x2)];

……所以,當x1k

< x < xk+1

<…< xn時,

y =(x1 + x2 + x3 + …… + xn) - n * x + 2[(x - x1) + (x - x2) + ……+ (x - xk)]

= (x1 + x2 + x3 + …… + xn) + 2[ (k - n/2)x - (x1 + x2 + ……+ xk) ] --(1 - 4)

對於公式(1 - 4),兩邊求導,可知當k - n/2 < 0 時,即k < n/2時,y 單調遞增;當k - n/2 > 0 時,即k > n/2時,y 單調遞減;因為k= ,為整數,若n為偶數,則當 k = n/2 時,x = xk,y有最小值;若n為奇數,則當 k = (n + 1)/2時,x = xk,y有最小值,證畢

綜上所述,得到的最終結論是:當 n 為偶數時,y的最小值為ymin= (xk+1+xk+2+ ……+xn) - (x1+x2+……+xk) , k = n/2 ;當 n 為奇數時,y的最小值為ymin= (xk+1+xk+2+ ……+xn) - (x1+x2+……+xk - 1) , k = (n + 1)/2 .

回到公式(1 - 2),分別求出(|u - u1|+|u - u2|+ ……+|u - un|) 和(|v - v1| +|v - v2| + ……+|u - un| +|v - vn|)的最小值,求平均數,即得到最小值bestdistance ,為程式所求.

龐果網之建立訊號基站

題目詳情 要建立乙個訊號基站服務n個村莊,這n個村莊用平面上的n個點表示。假設基站建立的位置在 x,y 則它對某個村莊 x,y 的距離為max,其中 表示絕對值,我們的目標是讓所有村莊到訊號基站的距離和最小。基站可以建立在任何實數座標位置上,也可以與某村莊重合。輸入 給定每個村莊的位置x,y,x,y...

龐果網之高斯公式

題目 題目詳情 高斯在上小學時發明了等差數列求和公式 1 2 100 5050。現在問題在於給你乙個正整數n,問你他可以表示為多少種連續正整數之和?自身也算 輸入格式 多組資料,每組資料一行,乙個正整數n。0輸出格式 每組資料一行,包含乙個正整數,表示結果。答題說明 輸入樣例 5120 輸出樣例 2...

龐果網之素因子集合

題目 題目詳情 小強最近在學初等數論,老師給他們出了乙個課後習題,那就是給你兩個正整數a,b 0 輸入描述 輸入包含多組測試資料,每組測試資料報含兩個正整數a,b,以檔案結束。輸出描述 對於每組測試資料如果a和b的素因子集合相同則輸出 yes 否則輸出 no 答題說明 輸入樣例 2 84 9 10 ...