社区讨论
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 条回复,欢迎继续交流。
正在加载回复...