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));
    }

 

 

 

posted on 2013-06-29 11:07  Ac_coral  阅读(235)  评论(0编辑  收藏  举报

导航