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