codeforce514 D. Nature Reserve 凸函数三分

本文介绍了一种使用三分法解决Codeforces 514D题目的算法,该问题要求找到一个与x轴相切并能覆盖所有给定点的最小半径圆。通过迭代逼近的方法,算法能在有限次数内找到满足精度要求的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法 三分法

codeforce514 D. Nature Reserve

给定若干个点,求包含所有点且与x轴相切的圆的最小半径

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+5;
const double eps=1e-8;
int n;
pair<double,double>a[MAX];
double l,r,midl,midr,lr,rr;
double dis(double x1,double x2,double y2)
{
    return (x1-x2)*(x1-x2)+y2*y2;
}
double getr(double x)
{
    double R=0.0;
    for(int i=0;i<n;++i)
    {
        double d=dis(x,a[i].first,a[i].second);
        R=max(R,fabs(d/a[i].second/2.0));
    }
    return R;
}
int main()
{
    while(~scanf("%d",&n))
    {
        bool yl=0,yr=0;int yo=0;
        l=rr=1e7,r=lr=-1e7;
        for(int i=0;i<n;++i)
        {
            scanf("%lf%lf",&a[i].first,&a[i].second);
            l=min(l,a[i].first);
            r=max(r,a[i].first);
            if(a[i].second>0) yl=1;
            else if(a[i].second<0) yr=1;
            else ++yo;
        }
        if((yl&&yr)||yo>1) {printf("-1\n");continue;}
        if(fabs(l-r)<eps)
        {
            double R=0.0;
            for(int i=0;i<n;++i) R=max(r,fabs(a[i].second));
            printf("%.8f\n",R/2.0);
            continue;
        }
        for(int i=0;i<100;++i)//100次逼近1e-6
        {
            midl=l+(r-l)/3.0;midr=r-(r-l)/3.0;//三分
            lr=getr(midl),rr=getr(midr);
            if(lr-rr>eps) l=midl;
            else r=midr;
        }
        printf("%.8f\n",(lr+rr)/2.0);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值