Codeforces - Barcelonian Distance
程序员文章站
2024-01-31 08:18:04
...
题目链接:Codeforces - Barcelonian Distance
我们可以发现,如果我们可以通过走直线更短,那么这条直线一定穿过 A,B两点围成的矩形。
所以我们可以求出和矩形的交点,然后取最小值即可。
这道题我们要防止科学计数法,不精确,所以我们可以用:
cout.setf(ios_base::fixed,ios_base::floatfield);
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long double lb;
const double eps=1e-8;
int a,b,c,x1,y1,x2,y2;
long double x[10],y[10],res;
inline lb dis(lb x1,lb y1,lb x2,lb y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
signed main(){
cin>>a>>b>>c>>x1>>y1>>x2>>y2;
res=abs(x1-x2)+abs(y1-y2); c=-c;
cout.setf(ios_base::fixed,ios_base::floatfield);
if(x1==x2||y1==y2||b==0||a==0) return cout<<res,0;
if(x1>x2) swap(x1,x2),swap(y1,y2);
x[1]=(1.0*c-b*y1)/a,y[1]=y1; x[2]=(1.0*c-b*y2)/a,y[2]=y2;
y[3]=(1.0*c-a*x1)/b,x[3]=x1; y[4]=(1.0*c-a*x2)/b,x[4]=x2;
for(int i=1;i<=4;i++) for(int j=1;j<=4;j++){
lb s1=fabs(x1-x[i])+fabs(y1-y[i]);
lb s2=dis(x[i],y[i],x[j],y[j]);
lb s3=fabs(x2-x[j])+fabs(y2-y[j]);
res=min(res,s1+s2+s3);
}
cout<<fixed<<setprecision(20)<<res<<endl;
return 0;
}
上一篇: Java复习总结篇
推荐阅读
-
Codeforces - Barcelonian Distance
-
codeforces Round #259(div2) B解题报告
-
Codeforces Round #277.5 (Div. 2)-C_html/css_WEB-ITnose
-
Codeforces Round #239 (Div. 2)_Long Path_html/css_WEB-ITnose
-
CodeForces 309B Context Advertising
-
Codeforces Round #271 (Div. 2) 解题报告_html/css_WEB-ITnose
-
Codeforces Round #256 (Div. 2) D. Multiplication Table_html/css_WEB-ITnose
-
Codeforces Round #262 (Div. 2)解题报告_html/css_WEB-ITnose
-
Codeforces Round #281 (Div. 2) 解题报告 A.B.C.D._html/css_WEB-ITnose
-
Codeforces Round #248 (Div. 2) A题_html/css_WEB-ITnose