题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数)

题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然后平移去过某个点,再根据此点进行旋转直到过另一个点,这样直线就被两个点确定了

而这样的直线一定是这些点形成的凸包的边,接着就是求出凸包后枚举每条凸包的边,再根据这条边找到所有点到这条边的距离总和

但是直接找会超时,那么我们用方程优化:

已知直线上的两点P1(X1,Y1) P2(X2,Y2), P1 P2两点不重合。

对于直线一般式:AX+BY+C=0:

A = Y2 - Y1

B = X1 - X2

C = X2*Y1 - X1*Y2

在平面直角坐标系中,已知点P(x0,y0),直线l:Ax+By+C=0(A﹒B≠0).设点P(x0,y0)到直线l的距离为d,则d=

这样预处理所有x0,y0的和,就可以使用O(1)找到所有点到这条边的距离总和

还有注意n=1与n=2的情况

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<iomanip>
  11. #include<stdlib.h>
  12. #include<iostream>
  13. #include<algorithm>
  14. using namespace std;
  15. #define eps 1E-8
  16. /*注意可能会有输出-0.000*/
  17. #define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  18. #define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  19. #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
  20. #define mul(a,b) (a<<b)
  21. #define dir(a,b) (a>>b)
  22. typedef long long ll;
  23. typedef unsigned long long ull;
  24. const int Inf=<<;
  25. const ll INF=1ll<<;
  26. const double Pi=acos(-1.0);
  27. const int Mod=1e9+;
  28. const int Max=;
  29. struct Point
  30. {
  31. double x,y;
  32. Point(double x=,double y=):x(x),y(y) {};
  33. int read()
  34. {
  35. scanf("%lf%lf",&x,&y);
  36. }
  37. inline Point operator+(const Point& a)const
  38. {
  39. return Point(x+a.x,y+a.y);
  40. }
  41. inline Point operator-(const Point& a)const
  42. {
  43. return Point(x-a.x,y-a.y);
  44. }
  45. inline bool operator<(const Point& a)const
  46. {
  47. return (sgn(x-a.x)<||(zero(x-a.x)&&sgn(y-a.y)<));
  48. }
  49. };
  50. typedef Point Vector;
  51. double Cross(Vector A,Vector B)
  52. {
  53. return A.x*B.y-A.y*B.x;
  54. }
  55. int ConvexHull(Point* p,int n,Point* convex)
  56. {
  57. sort(p,p+n);
  58. int m=;
  59. for(int i=;i<n;++i)
  60. {
  61. while(m>&&Cross(convex[m-]-convex[m-],p[i]-convex[m-])<)
  62. --m;
  63. convex[m++]=p[i];
  64. }
  65. int k=max(m,);
  66. for(int i=n-;i>=;--i)
  67. {
  68. while(m>k&&Cross(convex[m-]-convex[m-],p[i]-convex[m-])<)
  69. --m;
  70. convex[m++]=p[i];
  71. }
  72. if(n>)
  73. m--;
  74. return m;
  75. }
  76. Point home[Max],convex[Max];
  77. double Solve(int n,double sumx,double sumy)
  78. {
  79. if(n<=)
  80. return ;
  81. double minx=(double)INF;
  82. int m=ConvexHull(home,n,convex);
  83. double A,B,C;
  84. for(int i=;i<=m;++i)
  85. {
  86. A=convex[i%m].y-convex[i-].y;
  87. B=convex[i-].x-convex[i%m].x;
  88. C=convex[i%m].x*convex[i-].y-convex[i-].x*convex[i%m].y;
  89. minx=min(minx,fabs((A*sumx+B*sumy+C*n)/(sqrt(A*A+B*B))));
  90. }
  91. return minx;
  92. }
  93. int main()
  94. {
  95. int t,n;
  96. int coun=;
  97. double sumx,sumy;
  98. scanf("%d",&t);
  99. while(t--)
  100. {
  101. sumx=sumy=;
  102. scanf("%d",&n);
  103. for(int i=; i<n; ++i)
  104. {
  105. home[i].read();
  106. sumx+=home[i].x;
  107. sumy+=home[i].y;
  108. }
  109. printf("Case #%d: %.3f\n",++coun,Solve(n,sumx,sumy)/n+eps);
  110. }
  111. return ;
  112. }

UVA 11168 Airport(凸包+直线方程)的更多相关文章

  1. UVA 11168 Airport(凸包)

    Airport [题目链接]Airport [题目类型]凸包 &题解: 蓝书274页,要想到解析几何来降低复杂度,还用到点到直线的距离公式,之后向想到预处理x,y坐标之和,就可以O(1)查到距 ...

  2. UVA 11168 - Airport - [凸包基础题]

    题目链接:https://cn.vjudge.net/problem/UVA-11168 题意: 给出平面上的n个点,求一条直线,使得所有的点在该直线的同一侧(可以在该直线上),并且所有点到该直线的距 ...

  3. 简单几何(数学公式+凸包) UVA 11168 Airport

    题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...

  4. uva 11168 - Airport

    凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <alg ...

  5. UVa 11168(凸包、直线一般式)

    要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqr ...

  6. UVA - 11374 - Airport Express(堆优化Dijkstra)

    Problem    UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...

  7. UVa 11168 (凸包+点到直线距离) Airport

    题意: 平面上有n个点,求一条直线使得所有点都在直线的同一侧.并求这些点到直线的距离之和的最小值. 分析: 只要直线不穿过凸包,就满足第一个条件.要使距离和最小,那直线一定在凸包的边上.所以求出凸包以 ...

  8. uva 10065 (凸包+求面积)

    链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...

  9. UVA 11374 Airport Express SPFA||dijkstra

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. 关于JSF中immediate属性的总结(二)

    The immediate attribute in JSF is commonly misunderstood. If you don't believe me, check out Stack O ...

  2. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  3. Linux查找命令

    最近,我在学习Linux,下面是一些笔记. 使用电脑的时候,经常需要查找文件. 在Linux中,有很多方法可以做到这一点.国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条.大多数程序 ...

  4. JSON格式序列化与反序列化(List、XML)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  5. SEO之title优化

    作者:andyrat,联系方式:andyrat@qq.com

  6. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  7. 得到 window.open 新页面中的数据

    1.htm 页面 单击按  '钮后'  调用window.open方法,开启新窗口  2.htm 想实现---------------------- 在2.htm页面单击按钮 将相应的数据返回到 1. ...

  8. java+eclipse+selenium环境搭建

    这几天在学selenium,大头虾的我.安装环境还是遇到了挺多问题,赶紧来记录下.不然下次又...(参考虫师的<Selenium2 Java自动化测试实战>),就随便写写加深下自己的印象. ...

  9. The difference between QA, QC, and Test Engineering

    Tuesday, March 06, 2007 Posted by Allen Hutchison, Engineering Manager and Jay Han, Software Enginee ...

  10. centos 安装pip,使用pip安装django

    python版本要2.7.x以上版本,若未安装python执行以下命令安装: wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz ...