社区讨论

How E

学术版参与者 10已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mhj39plb
此快照首次捕获于
2025/11/03 20:00
4 个月前
此快照最后确认于
2025/11/03 20:43
4 个月前
查看原帖
感觉用三分写没问题呀,一直 WA 9 个点左右
CPP
#define double long double

typedef pair<double,double> pdd;

const double eps=1e-10;

int T;
double a,b,c,d,e,f,g,h;

double dis(double x1,double y1,double x2,double y2) {
    double dx=x1-x2;
    double dy=y1-y2;
    return sqrt(dx*dx+dy*dy);
}

pdd solveA(double x) {
    x=min(x,dis(a,b,c,d));
    double D=dis(a,b,c,d);
    return {a+(x*(c-a)/D),b+(x*(d-b)/D)};
}

pdd solveB(double x) {
    x=min(x,dis(e,f,g,h));
    double D=dis(e,f,g,h);
    return {e+(x*(g-e)/D),f+(x*(h-f)/D)};
}

double solve(double x) {
    auto a=solveA(x);
    auto b=solveB(x);
    return dis(a.first,a.second,b.first,b.second);
}

int main() {
    read(T);
    while (T--) {
        scanf("%Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf",&a,&b,&c,&d,&e,&f,&g,&h);
        double l=0.0,r=max(dis(a,b,c,d),dis(e,f,g,h));
        double ans=min(solve(l),solve(r));
        while (r-l>eps) {
            double len=(r-l)/3;
            double lmid=l+len,rmid=r-len;
            double L=solve(lmid),R=solve(rmid);
            ans=min(ans,L);
            ans=min(ans,R);
            if (L<R) r=rmid;
            else l=lmid;
        }
        ans=min(ans,solve(l));
        ans=min(ans,solve(r));
        printf("%.18Lf\n",ans);
    }
    return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...