• CF1032D Solution


    题目链接

    题解

    可以分两类讨论(A,B)点间的最短路径,经过函数与不经过函数,其中不经过函数的情况曼哈顿距离即可。

    可得在只能经过格点的情况下,点(A)到函数(f)最短距离的点(x)值与(y)值中一定有一项与(A)相等。
    也就是如左图,点(A)到直线的最短距离一定为(AD)(AC)的最小值,(B)同理。

    感谢机房神仙提供的证明!(。・∀・)ノ:

    当斜率(>1)时右下((x)相等时)同理。

    因此经过函数的情况只需枚举上图中的(C,D,E,F),排列组合取最小值即可。

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	double a,b,c,xa,xb,ya,yb;
    	scanf("%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&xa,&ya,&xb,&yb);
    	double ans1=abs(xa-xb)+abs(ya-yb),ans2;
        //ans1:曼哈顿距离,ans2:经过函数的最短距离
    	double tx1=-(b*ya+c)/a,ty1=-(a*xa+c)/b,tx2=-(b*yb+c)/a,ty2=-(a*xb+c)/b;
        //tx1:C的x值,ty1:D的y值,tx2:E的x值,ty2:F的y值
        //经过CF的情况
    	ans2=abs(tx1-xa)+sqrt((tx1-xb)*(tx1-xb)+(ty2-ya)*(ty2-ya))+abs(ty2-yb);
        //经过DE的情况
    	ans2=min(ans2,abs(tx2-xb)+sqrt((tx2-xa)*(tx2-xa)+(ty1-yb)*(ty1-yb))+abs(ty1-ya));
    	//经过CE的情况
        ans2=min(ans2,abs(tx1-xa)+sqrt((tx1-tx2)*(tx1-tx2)+(ya-yb)*(ya-yb))+abs(tx2-xb));
    	//经过DF的情况
        ans2=min(ans2,abs(ty1-ya)+sqrt((ty1-ty2)*(ty1-ty2)+(xa-xb)*(xa-xb))+abs(ty2-yb));
    	printf("%lf",min(ans1,ans2));
    	return 0;
    }
    
  • 相关阅读:
    随便发泄几句
    四年有感
    测试产品杂谈
    质量管理杂谈
    提升
    下半年工作方向
    测试资源分配
    2013思路
    微博吐槽汇总
    招聘
  • 原文地址:https://www.cnblogs.com/violetholmes/p/14254257.html
Copyright © 2020-2023  润新知