題目詳情
要建立乙個訊號基站服務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)按照變數u和v分為兩部分,分別求最小值,和起來也肯定是最小值;
對於函式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 ...