zoj 3386 Trick or Treat 三分 求最大值的 最小值
生活随笔
收集整理的這篇文章主要介紹了
zoj 3386 Trick or Treat 三分 求最大值的 最小值
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目來源:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3963
題意: ?給定 N 個不同的點, 求在x軸上的 一點, ?使 這點到N個點的 距離 最大 的 最小值。
f(x) = ?max(i){ (xi - x) ^2 + yi ^2 }
求 x ?使 ?min(f(x)) , f(x)為凹函數(shù) ? , ?采用三分的形式
代碼如下:
const double EPS = 1e-10 ; const int Max_N = 50005 ; int n; double add(double a, double b){return (fabs(a + b) < EPS * (fabs(a) + fabs(b))) ? 0 : (a + b) ; } struct Point {double x, y;double dist(double a){return sqrt(add((x - a)*(x -a) ,(y)*(y) )) ;} }; Point pt[Max_N] ; double f(double x){int i ;double Max = 0 ;for( i = 0 ; i < n; i++){Max = pt[i].dist(x) > Max ? pt[i].dist(x) : Max ;}return Max ; } double tri_search(){double Mid, Midmid , L, R ;L = -400000.0 , R = 400000.0 ;while(L + EPS < R){Mid = (L + R) * 0.5 ;Midmid = (Mid + R) *0.5 ;if(f(Mid) <= f(Midmid ) )R = Midmid ;else L = Mid ;}return L ; } int main(){while(scanf("%d", &n) && n){for(int i =0 ; i < n ; i++)scanf("%lf%lf" , &pt[i].x ,&pt[i].y ) ;double xx = tri_search() ;double Max = f(xx) ;printf("%.9lf %.9lf\n" , xx + EPS , Max) ;} }?
轉(zhuǎn)載于:https://www.cnblogs.com/zn505119020/p/3729693.html
總結(jié)
以上是生活随笔為你收集整理的zoj 3386 Trick or Treat 三分 求最大值的 最小值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Edit + MASM 5.0 编
- 下一篇: 控件(待整理)