zoukankan      html  css  js  c++  java
  • UVa11168 Airport

    题目大意:给出平面上n个点,找一条直线,使得所有点在直线的同一侧(点可以在直线上),且所有点到直线的距离之和最小,求出最小平均距离。

    大概思路:求n个点集的凸包,对于凸包里的m个点,进行m次判断,每次找q[i]和q[(i+1)%sz],注意最后一个点要和第0个点组成直线判断。

    求出由两个点所确定直线的一般方程A*x+B*y+C=0;

    点到直线的距离公式:|A*x0+B*y0+C| / √(A2+B2) 。。。

    因为所有点在直线的同一侧,所以所有的A*x0+B*y0+C的符号相同,

    由此得出所有点的距离之和等于:|A*X+B*Y+C*n| / √(A2+B2), 其中,X为x坐标之和,Y为y坐标之和。。

    值得注意的是:

    一定要判断当凸包退化成一个点的情况,此时直线的一般方程A=0, B=0,距离之和被0除,求出来的结果是无穷大。。。

    凸包退化成两个点(线段)时,不会出现被0除的情况,这种情况本可以不用判断,为了减少运算量。。。。特判一下也好~

        if(sz <= 2) ans = 0;//凸包退化成点或者线段,答案为0
        else for(int i = 0; i < sz; ++i) {
          getLineGeneralEquation(q[i], q[(i+1)%sz], A, B, C);
          ans = min(ans, fabs(A*X+B*Y+C*n)/sqrt(A*A+B*B));
        }
  • 相关阅读:
    iscroll 子表左右滚动同时保持页面整体上下滚动
    mac xampp命令行调用mysql
    学习—ReentrantLock
    sychronized和lock的区别
    学习——常见垃圾回收器
    学习——java内存模型
    学习——哈夫曼编码
    数据库—Innodb中的MVVC
    学习-事务-事务特性
    学习——事务-事务隔离级别
  • 原文地址:https://www.cnblogs.com/Accoral/p/3162121.html
Copyright © 2011-2022 走看看