开场被A劝退,写了得有50min于是不敢交了。unrated了喜闻乐见。
A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下比较显然(事实上也就是以起点终点为对角点构成的矩形与该直线的交点)。看错题以为到直线上的那个点必须是整点,于是搞了半天exgcd。然而就算这样也不至于写这么长时间啊根本不知道自己在干啥。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define double long double char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;} int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } double ans,A,B,C,lx,ly,rx,ry; double dis_m(double x,double y,double p,double q){return fabs(x-p)+fabs(y-q);} double dis_o(double x,double y,double p,double q){return sqrt((p-x)*(p-x)+(y-q)*(y-q));} struct data{double x,y; }a[2],b[2]; int main() { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif A=read(),B=read(),C=read(); lx=read(),ly=read(),rx=read(),ry=read(); ans=fabs(rx-lx)+fabs(ry-ly); if (A&&B) { a[0].x=lx,a[0].y=(-C-A*lx)/B; a[1].y=ly,a[1].x=(-C-B*ly)/A; b[0].x=rx,b[0].y=(-C-A*rx)/B; b[1].y=ry,b[1].x=(-C-B*ry)/A; for (int i=0;i<2;i++) for (int j=0;j<2;j++) ans=min(ans,dis_m(lx,ly,a[i].x,a[i].y)+dis_o(a[i].x,a[i].y,b[j].x,b[j].y)+dis_m(b[j].x,b[j].y,rx,ry)); } printf("%.6Lf\n",ans); return 0; }