2018-ACM-ICPC 南京 D. Country Meow 三分套三分套三分

题目链接:题目链接
题目大意:三维空间有n个点,找到另外一个点,离所有点的最大距离最小。求这个距离。
这个点的任意坐标,在其他两个坐标确定的情况下,最大距离都是一个单峰函数,那么就可以三分套三分套三分。

#include <bits/stdc++.h>
using namespace std;
#define eps 1e-3
int n;
struct node{
    double p[3];
}a[100005];

double MAX_DIT(node ans){

    double MAX=0;
    for(int i=1; i<=n; i++){
        MAX=max(MAX, sqrt((ans.p[0]-a[i].p[0])*(ans.p[0]-a[i].p[0])+(ans.p[1]-a[i].p[1])*(ans.p[1]-a[i].p[1])+(ans.p[2]-a[i].p[2])*(ans.p[2]-a[i].p[2])));
    }
    return MAX;
}

node sf(int cut, node now){
    if(cut>=3){
        return now;
    }
    node ans, Lans, Rans;
    double L=-100000, R=100000, LL, RR;
    ans=Lans=Rans=now;
    
    //for(int i=1; i<=50; i++) 严格控制三分的次数 防T
    while(eps<R-L){
        LL=(2*L+R)/3, RR=(2*R+L)/3;//两个三分点

        Lans.p[cut]=LL, Rans.p[cut]=RR;//赋值
        
        Lans=sf(cut+1, Lans);//继续三分下个轴的坐标
        Rans=sf(cut+1, Rans);//继续三分下个轴的坐标

        if(MAX_DIT(Lans)>MAX_DIT(Rans)){
            ans=Lans, L=LL;
        }
        else{
            ans=Rans, R=RR;
        }
    }

    return ans;
}


int main(){

    while(~scanf("%d", &n)){
        for(int i=1; i<=n; i++){
            scanf("%lf%lf%lf", &a[i].p[0], &a[i].p[1], &a[i].p[2]);
        }
        node ans;
        printf("%.8f\n", MAX_DIT(sf(0, ans)));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值