程式設計之美初賽第一場 題目3 活動中心

2022-02-18 22:49:19 字數 2892 閱讀 1893

時間限制: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

三分法——求解凸性函式的極值問題

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以「大顯身手」~~

如圖,類似二分的定義left和right,mid = (left + right) / 2,midmid = (mid + right) / 2; 如果mid靠近極值點,則right = midmid;否則(即midmid靠近極值點),則left = mid;

程式模版如下:

double

calc(type a)

void solve(void

)}

現根據幾道的oj題目來分析三分法的具體實現。

buaa 1033 easy problem 

題意為在一條線段上找到一點,與給定的p點距離最小。很明顯的凸性函式,用三分法來解決。

calc函式即為求某點到p點的距離。

zoj 3203 light bulb

如圖,人左右走動,求影子l的最長長度。

根據圖,很容易發現當燈,人的頭部和牆角成一條直線時(假設此時人站在a點),此時的長度是影子全在地上的最長長度。當人再向右走時,影子開始投影到牆上,當人貼著牆,影子長度即為人的高度。所以當人從a點走到牆,函式是先遞增再遞減,為凸性函式,所以我們可以用三分法來求解。

下面只給出calc函式,其他直接套模版即可。

double calc(double

x)

heru 5081 turn the corner 08年哈爾濱regional網路賽

汽車拐彎問題,給定x, y, l, d判斷是否能夠拐彎。首先當x或者y小於d,那麼一定不能。

其次我們發現隨著角度θ的增大,最大高度h先增長後減小,即為凸性函式,可以用三分法來求解。

這裡的calc函式需要比較繁瑣的推倒公式:

s = l * cos(θ) + w * sin(θ) - x;

h = s * tan(θ) + w * cos(θ);

其中s為汽車最右邊的點離拐角的水平距離, h為里拐點最高的距離, θ範圍從0到90。

poj 3301 texas trip

題意為給定n(n <= 30)個點,求出飽含這些點的面積最小的正方形。

有兩種解法,一種為逼近法,就是每次m分角度,求出最符合的角度,再繼續m分,如此進行times次,即可求出較為精確的解。(m 大概取10, times取30即可)

第二種解法即為三分法,首先旋轉的角度只要在0到180度即可,超過180度跟前面的相同的。座標軸旋轉後,座標變換為:

x』 = x * cosa - y * sina;

y』 = y * cosa + x * sina;

至於這題的函式是否是凸性的,為什麼是凸性的,我也無法給出準確的證明,希望哪位路過的大牛指點一下~~

對於求解一些實際問題,當公式難以遞推.

本題ac**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

doublex[

111111],y

[111111

];int n;

doublemi,

ma;double

dis(doublexx,

intk)

intmain()

double

low=mi,

high=ma

,mid

,mmd;

doublel1,

l2;while(high

-low

>

1e-8)

if(l1

>

l2)else

low=

mmd;

}printf("case %d: %.6f\n"

,ca++,

low);

}return0;}

程式設計之美初賽第一場 題目3 活動中心

時間限制 12000ms 單點時限 6000ms 記憶體限制 256mb a市是乙個高度規劃的城市,但是科技高階發達的地方,居民們也不能忘記運動和鍛鍊,因此城市規劃局在設計a市的時候也要考慮為居民們建造乙個活動中心,方便居住在a市的居民們能隨時開展運動,鍛鍊強健的身心。城市規劃局希望活動中心的位置滿...

程式設計之美初賽第一場

時間限制 12000ms 單點時限 6000ms 記憶體限制 256mb a市是乙個高度規劃的城市。可是科技高階發達的地方,居民們也不能忘記運動和鍛鍊,因此城市規劃局在設計a市的時候也要考慮為居民們建造乙個活動中心。方便居住在a市的居民們能隨時開展運動。鍛鍊強健的身心。城市規劃局希望活動中心的位置滿...

程式設計之美初賽第一場 題目2 樹

時間限制 4000ms 單點時限 2000ms 記憶體限制 256mb 有乙個n個節點的樹,其中點1是根。初始點權值都是0。乙個節點的深度定義為其父節點的深度 1,特別的,根節點的深度定義為1。問完成所有操作後,各節點的權值是多少。為了減少巨大輸出帶來的開銷,假設完成所有操作後,各節點的權值是ans...