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