SCOI2010 傳送帶(三分套三分)

2021-09-24 12:53:30 字數 1091 閱讀 5627

第一次接觸三分演算法,我認為是比較好理解的。三分演算法用於求單峰函式的最值,與二分不同,二分用於求單調函式中趨近某個值的值。

三分搜尋的實現主要是判斷midl和midr所在值的大小。以凸函式為例(凹函式類似,只是判mid大小的時候保留小的即可(其實也是保留離極值最近的mid)),先以left和right為端點計算出它們的中點midl,然後再以midl和right為端點計算出它們的中點midr,接下來就需要判斷f(midl)和f(midr)值的大小了,如果f(midl)大於f(midr),那麼說明midl靠近極值,此時令right=midr,否則說明midr靠近極值,此時則令left=midl,總之就是要保留離極值最近的那乙個mid,然後重複前面的過程,直到left和right十分接近,最終f(left)就等於了極值。(摘自博主huzujun)

來看這道題,有兩條線段ab,cd,在ab上行走的速度為p,cd上行走的速度為q,平面裡行走的速度為r(r>p,q)。求從a走到d的最短距離。

無論如何,路線都是ae—ef—fd,不妨先把e點定下來,現在要求ef/r+fd/q的最小值,根據初中數學知識,這個東西用勾股定理之類的表示出來發現他確實是乙個單峰函式(或者可以用幾何畫板畫一畫),是可以用三分法求出來的。

所以,綜合起來,就是乙個三分套三分。

#includeusing namespace std;

const double eps=1e-8;

double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;

double dis(double a,double b,double c,double d)

double f(double x,double y,double tx,double ty)

double calc1(double x,double y)

return f(x,y,lx,ly);

}double calc()

return calc1(lx,ly)+dis(ax,ay,lx,ly)/p;

}int main()

Scoi2010 傳送帶(三分套三分 九分)

描述 在乙個2維平面上有兩條傳送帶,每一條傳送帶可以看成是一條線段。兩條傳送帶分別為線段ab和線段cd。lxhgww在ab上的移動速度為p,在cd上的移動速度為q,在平面上的移動速度r。現在lxhgww想從a點走到d點,他想知道最少需要走多長時間 輸入輸入資料第一行是4個整數,表示a和b的座標,分別...

SCOI2010 傳送帶 三分答案

平面上有兩條傳送帶,在上面行走有一定的速度,在平面其他地方行走有一定速度,求從一條傳送帶一端走到另一條一端的時間。顯然在兩條傳送帶都走一段後走平面,當乙個轉折點確定後,距離就是乙個單峰函式,可以用三分解決,總的就是三分套三分。由於資料較小精度要求較小,可以暴力乙個轉折點再三分。include inc...

三分學習筆記 SCOI2010 傳送帶

在乙個2維平面上有兩條傳送帶,每一條傳送帶可以看成是一條線段。兩條傳送帶分別為線段ab和線段cd。lxhgww在ab上的移動速度為p,在cd上的移動速度為q,在平面上的移動速度r。現在lxhgww想從a點走到d點,他想知道最少需要走多長時間 終於敢說我會三分了 本題是三分套三分的經典例題 分別在兩個...