程式設計之美 活動中心問題與三分法

2021-06-21 23:25:05 字數 2025 閱讀 2461

樓主小弱一枚,發現在找工作中演算法還是非常有用的。所以決心現在開始逐步學習。自己初賽都過不去,覺得看下這些題目還是蠻有意思的,總結了網上別人的方法,來寫點自己的理解。

題目描述

時間限制:

12000ms

單點時限:

6000ms

記憶體限制:

256mb

a市是乙個高度規劃的城市,但是科技高階發達的地方,居民們也不能忘記運動和鍛鍊,因此城市規劃局在設計a市的時候也要考慮為居民們建造乙個活動中心,方便居住在a市的居民們能隨時開展運動,鍛鍊強健的身心。

城市規劃局希望活動中心的位置滿足以下條件:

1. 到所有居住地的總距離最小。

2. 為了方便活動中心的資源補給和其他器材的維護,活動中心必須建設在a市的主幹道上。

為了簡化問題,我們將a市擺在二維平面上,城市的主幹道看作直角座標系平的x軸,城市中所有的居住地都可以看成二維平面上的乙個點。

現在,a市的城市規劃局希望知道活動中心建在哪兒最好。

第一行包括乙個數t,表示資料的組數。

接下來包含t組資料,每組資料的第一行包括乙個整數n,表示a市共有n處居住地

接下來n行表示每處居住地的座標。

對於每組資料,輸出一行「case x: y」,其中x表示每組資料的編號(從1開始),y表示活動中心的最優建造位置。我們建議你的輸出保留y到小數點後6位或以上,任何與標準答案的絕對誤差或者相對誤差在10-6以內的結果都將被視為正確。

小資料:1 ≤ t ≤ 1000, 1 ≤ n ≤ 10

大資料:1 ≤ t ≤ 10, 1 ≤ n ≤ 105

對於所有資料,座標值都是整數且絕對值都不超過106

樣例1:活動中心的最優建造位置為(1.678787, 0)

樣例輸入

1

31 1

2 23 3

樣例輸出

case 1: 1.678787
解法網上一搜,很多人說用三分法解,具體為什麼,估計各類大牛都不懈於細說,剛好我有時間寫個詳細解題過程。

我們一步步來看這個問題。

假設平面上的n個點分別為(x1,y1),(x2,y2),..., (xn,yn),為方便計算,不妨設定x1<=x2<=....<=xn。

題目所求,即在x軸上找一點(x,0),到所有點的距離和最小。距離可以如下計算:

問題轉化為求該式的最小值。

如果可以直接找到其解析解最好了,不過看起來不容易。

沒有好的竅門,所以對s(x)求導:

當x=x1時,函式s'(x)<=0。當x=xn時,s'(x)>=0。如果s'(x)單增,則導函式由負到正,s(x)先減後增,剛好有乙個凹點,且位於區間[x1,xn]上。

對s'(x)再次求導:

驗證了剛剛的設想,s''(x)>=0,因而s'(x)單增。所以在[x1,xn]之間有乙個極小值點,求解該極小值即可。

對於單調的函式,可以用二分法查詢某個解。對於凹凸性函式,求解極值可以採取三分法。

如圖是求解凸函式極值點的乙個示意圖。mid=(left+right)/2, midmid=(mid+right)/2。每次選定mid和midmid後比較大小,

如果value[mid] > value[midmid],極值點必定位於直線y=value[midmid]以上部分。可以排除區間[midmid,right],所以令right=midmid。

反之,如果value[mid] < value[midmid],極值點必定位於直線y=value[mid]以上部分。可以排除區間[left, mid],所以令left=mid。

重複上述過程,直到滿足要求精度為止。

double calc(type a)

void solve(void)

}

本題是求解凹函式極小值的,原理類似,至此不再詳述。

本文介紹凸函式部分及**模板,來自該文:

二分法與三分法

二分查詢基於分治策略的一種查詢方法,時間複雜度 o log 是用於解決單調有序問題,縮小問題規模 演算法步驟 演示 int binary search1 int num,int n,int x else return 1 二分問題模型 11110000問題 首先我們需要明確我們的目的是為了不斷縮小問...

三分法解決假幣問題(JAVA

一,問題描述 有n個硬幣,其中有一枚是假幣,假幣比真幣要輕,現有一天平,通過比較找出假幣。二,三分法思路 1.將硬幣分為三堆,每堆按照n 3向上取整個硬幣來分配 主要分配前兩堆,第三堆就是剩下的 2.比較第一堆和第二堆硬幣重量 若重量相等,則在第三堆中找假幣,重複第一步 若第一堆比第二堆重,則在假幣...

三分法解決凸(凹)函式極值問題

二分法只適用與線性函式,當函式脫離線性而呈現凸性或者凹性的時候,三分是很有必要的。三分過程如下圖 凸函式 凹函式 實現方法 double calc double p double solve double min,double max return mid area 例題 hdu4355 party...