开场被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;
}
View Code

相关文章:

  • 2021-08-19
  • 2021-06-08
  • 2021-07-27
  • 2021-06-27
  • 2021-08-19
  • 2021-05-17
猜你喜欢
  • 2021-09-21
  • 2021-08-04
  • 2022-02-07
  • 2021-06-16
  • 2021-04-02
  • 2021-05-16
  • 2021-06-28
相关资源
相似解决方案