欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}