我們假定在\(a, b\)上選取點\(e\),在\(c, d\)上選取點\(f\),我們的移動路徑是\(a -> e -> f -> d\)。
當我們確定\(e\)點時,不難發現\(dis(e -> f + f -> d)\)是乙個凹函式,具有極小值。
當我們確定\(f\)點時不難發現\(dis(a -> e + e -> f)\)也是乙個凹函式,具有極小值。
這兩段函式連線起來,不難發現也是乙個凹函式,具有極小值。
這就好像是乙個套娃的三分了,我們可以通過確定\(e\)點,然後去找到\(min\ dis(e -> f + f -> d)\)
然後由於函式具有整體的凹性,我們只要通過基礎的三分來三分點\(e\),就能確定最後的答案。
具體有一些細節在**中。
#include using namespace std;
const double eps = 1e-6;
double p, q, r;
struct point ;
}a, b, c, d, e, f;
double dis(point a, point b)
double calc2(double x)
double calc1(double x)
//calc2 + cost(a -> e)。
return calc2(l) + (x / p);
}int main()
// cout << l << " " << r << endl;
printf("%.2f\n", calc1(l));
// puts("");
}return 0;
}
8
0 0 4 1
4 1 0 2
8 8 1
0 0 0 100
100 0 100 100
2 2 1
8 0 23 8
4 2 91 0
4 9 10
0 0 2 2
0 2 2 0
4 3 1
1 8 1000 10
0 689 10 1000
90 1 20
4 9 4 20
4 41 4 60
4 4 1
4 9 4 20
4 91 4 60
4 3 1
0 5 8 5
2 5 4 0
6 9 3
1.03
136.60
8.30
0.83
49.60
28.50
42.75
0.93
hdu 3400 Line belt 三分套三分)
題意 在乙個二維空間中給出兩條線段ab,cd,線段ab,cd上的運動速度分別為p,q。在這兩條線段之外的空間上運動的速度為r。求從a到d的最短時間。思路 ps 在這種求解方法中,中間運用了比較多的除法,導致精度損失,所以再開方前加乙個eps,防止開方後的值比真實值小。include include ...
HDU3400 Line belt 三分法 C語言
題目 題目大意 給出a b c d四點座標,在ab上速度為p,cd上速度為q,其他地方速度為r。求從a到d的最短時間 思路 兩個三分巢狀,ab線段三分,內層巢狀cd線段內的三分 提交情況 wa 1次,ac 1次 總結 內層的三分時,每次都要重新賦兩端點的值為c d的值,因為前一次搜尋結束後,端點值已...
hdu 3400 悲劇的三分
題意 就是給你兩條線段ab cd 乙個人在ab上跑速度p,在cd上跑q,在其他地方跑速度是r。問你從a到d最少的時間是好多。解法。比賽時候看題就想起之前hs教我的三分,結果寫了全場的,都沒有過的。哎太挫了。正確解法就是 對ab上三分乙個e點,在cd上三分乙個點f,然後三分完了之後就是最後的結果了的。...