Codeforces 1078 - A/B/C/D/E - (Undone)

链接:https://codeforces.com/contest/1078


A - Barcelonian Distance - [分类讨论]

题意:

给出一个在二维平面直角坐标系第一象限内的,单位长度为 $1$ 的无限大网格,每条直线都代表道路。又给你一条直线 $ax+by+c=0$,也代表一条道路。

现在给你两个格点坐标 $(x_1,y_1)$ 和 $(x_2,y_2)$,让你求该两点间最短的道路距离。

题解:

一个矩形,它的四条边无限延长,跟另外一条直线,会产生两个(直线水平或竖直)或者四个交点(直线倾斜),计算出这个些点,然后算出所有可能的走法的长度即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> pff;
const double eps=1e-10;
double a,b,c;
pff p1,p2;
pff q1,q2,q3,q4;
double ans,ans1,ans2,ans3,ans4;
inline double dist(const pff& a,const pff& b) {
    return sqrt(pow(a.first-b.first,2)+pow(a.second-b.second,2));
}
inline double min(double a,double b,double c,double d,double e)
{
    double res=a;
    res=min(res,b);
    res=min(res,c);
    res=min(res,d);
    res=min(res,e);
    return res;
}
int main()
{
    ans=ans1=ans2=ans3=ans4=1e12;
    cin>>a>>b>>c>>p1.first>>p1.second>>p2.first>>p2.second;
    ans=fabs(p1.first-p2.first)+fabs(p1.second-p2.second);
    if(fabs(a)<eps)
    {
        q1=make_pair(p1.first,-c/b);
        q2=make_pair(p2.first,-c/b);
        ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2);
    }
    else if(fabs(b)<eps)
    {
        q1=make_pair(-c/a,p1.second);
        q2=make_pair(-c/a,p2.second);
        ans2=fabs(p1.first-q1.first)+dist(q1,q2)+fabs(p2.first-q2.first);
    }
    else
    {
        q1=make_pair(p1.first,-(a*p1.first+c)/b);
        q3=make_pair(-(b*p1.second+c)/a,p1.second);
        q2=make_pair(p2.first,-(a*p2.first+c)/b);
        q4=make_pair(-(b*p2.second+c)/a,p2.second);
        ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2);
        ans2=dist(p1,q1)+dist(q1,q4)+dist(q4,p2);
        ans3=dist(p1,q3)+dist(q3,q2)+dist(q2,p2);
        ans4=dist(p1,q3)+dist(q3,q4)+dist(q4,p2);
    }
    printf("%.10f\n",min(ans,ans1,ans2,ans3,ans4));
}

B - The Unbearable Lightness of Weights - []

题意:

猜你喜欢

转载自www.cnblogs.com/dilthey/p/9998768.html