题目是英文的,这里就不给出来了。

题目的大意是说,在平面上有n个点,要找一条直线,使所有点到直线的平均距离最小,且这些点都在该直线的同一侧(包括直线上)。

那么,既然要使距离最小化,还要使所有点一定在这条直线的同一侧或在这条直线上。恰好,所有点构成的凸包的每条边所在直线都满足了这一要求,并且,凸包上的边比凸包外

边更优。

那么,我们完全可以现将凸包上的点算出(这次用了快而稳的Andrew),然后枚举相邻两点构成的直线。那么,问题来了——平均距离怎么求?如下:

我们已知直线的两个点:(x1,y1),(x2,y2),也就知道了直线的两点式:

(x1-x)/(x1-x2)=(y1-y)/(y1-y2),整理一下:

x1y1-x1y2-xy1+xy2=x1y1-x1y-x2y1+x2y

(y2-y1)x+(x1-x2)y+(x2y1-x1y2)=0(也就是一般式Ax+By+C=0)

其中A=y2-y1,B=x1-x2,C=x2y1-x1y2。

这有什么用?

如图,AP*BP=AB*CP,我们所需要的是CP。

CP=AP*BP/AB=(|(Ax0+By0+C)/A|*|(Ax0+By0+C)/B|)/根号(|(Ax0+By0+C)/A|^2+|(Ax0+By0+C)/B|^2)

=|(Ax0+By0+C)^2/AB|/根号((Ax0+By0+C)^2*(A^2+B^2)/A^2*B^2)

=|(Ax0+By0+C)^2/AB|/[(Ax0+By0+C)/AB)*根号(A^2+B^2)]

=|Ax0+By0+C|/根号(A^2+B^2)

= |Ax0+By0+C|

-----------------

根号(A^2+B^2)

然后就显而易见了。对于每条直线,A,B,C是固定的,我们只需要提前求出Σx和Σy就行了。

所以

ans=min(

|AΣx+BΣy+C*n|

---------------

根号(A^2+B^2)

)

代码如下:

 #include<cmath>
 #include<cctype>
 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 using namespace std;
 ;
 struct point{
     int x,y;
 }a[maxn],st[maxn];
 struct line{
     int A,B,C;
 };
 int n,len,Sum_x,Sum_y;
 double ans;
 inline int read(){
     ,f=; char ch=getchar();
     while (!isdigit(ch)){if (ch=='-') f=-f; ch=getchar();}
     +ch-',ch=getchar();
     return x*f;
 }
 point operator - (point a,point b){
     point c; c.x=a.x-b.x,c.y=a.y-b.y;
     return c;
 }
 double cross(point u,point v){
     return (double)u.x*v.y-(double)v.x*u.y;
 }
 bool cmp(point u,point v){
     if (u.x!=v.x) return u.x<v.x; else return u.y<v.y;
 }
 void Tubao(){
     sort(a+,a+n+,cmp); len=;
     ; i<=n; i++){
         &&cross(st[len]-st[len-],a[i]-st[len-])<=) len--;
         st[++len]=a[i];
     }
     int orilen=len;
     ; i>=; i--){
         ],a[i]-st[len-])<=) len--;
         st[++len]=a[i];
     }
 }
 double abso(double x){
     ?-x:x;
 }
 line getline(point u,point v){
     line li; li.A=v.y-u.y,li.B=u.x-v.x,li.C=v.x*u.y-u.x*v.y;
     return li;
 }
 double calc(line li){
     double v;
     &&li.B!=){
         double v1=abso((double)li.A*Sum_x+(double)li.B*Sum_y+(double)li.C*n),v2=sqrt((double)li.A*li.A+(double)li.B*li.B);
         v=v1/v2;
     }else
     ){
         v=abso((double)Sum_y-(double)n*(-li.C)/li.B);
     }else
     ){
         v=abso((double)Sum_x-(double)n*(-li.C)/li.A);
     }
     return v;
 }
 int main(){
     int T=read();
     ; kase<=T; kase++){
         n=read(),Sum_x=Sum_y=len=,ans=1e18,memset(a,,,sizeof st);
         ; i<=n; i++){
             int x=read(),y=read();
             a[i].x=x,a[i].y=y,Sum_x+=x,Sum_y+=y;
         }
         ){printf("Case #%d: %.3f\n",kase,0.000); continue;}
         Tubao();
         ; i<len; i++){
             line li=getline(st[i],st[i+]);    ans=min(ans,calc(li));
         }
         printf("Case #%d: %.3f\n",kase,ans/(double)n);
     }
     ;
 }

[Uva P11168] Airport的更多相关文章

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

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

  2. UVA 11374 Airport Express SPFA||dijkstra

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

  3. UVA 11374 Airport Express(最短路)

    最短路. 把题目抽象一下:已知一张图,边上的权值表示长度.现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小. 当加上一条边a->b,如果这条边更新了最短路,那么起点st- ...

  4. UVA 11168 Airport(凸包)

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

  5. UVA - 11374 Airport Express (Dijkstra模板+枚举)

    Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...

  6. UVA 11168 Airport(凸包+直线方程)

    题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然 ...

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

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

  8. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  9. uva 11168 - Airport

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

随机推荐

  1. 【NOIP 2016】Day2 T3 愤怒的小鸟

    Problem Description \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\ ...

  2. Java—网络编程基础

    URL的应用: 获得网页源代码可以用字节流.字符流,流的获取可以用url.openStream(),也可以用con.getInputStream(): 字节流: URL url = new URL(& ...

  3. 利用angularjs完成注册表单

    ng-init="username = 'first'"设置初始显示first字段 ng-class="{'error':signUpForm.username.$inv ...

  4. 【SQLite】可视化工具SQLite studio

    SQLite数据库的特性 特点: 1.轻量级2.独立性,没有依赖,无需安装3.隔离性 全部在一个文件夹系统4.跨平台 支持众多操作系统5.多语言接口 支持众多编程语言6.安全性 事物,通过独占性和共享 ...

  5. javaSE习题 第三章 运算符、表达式和语句

    问答: 1.下列System.out.printf的结果是什么? int a=100,x,y; x=++a; y=a--; System.out.printf("%d,%d,%d" ...

  6. 记录Python类与继承的一个错误

    今天在学python的类与继承的时候遇到一个错误,原来是自己在ctrl+c  ctrl+v的时候漏了一个括号 class Car(): def __init__(self,make,year,mode ...

  7. => js 中箭头函数使用总结

    箭头函数感性认识 箭头函数 是在es6 中添加的一种规范 x => x * x 相当于 function(x){return x*x} 箭头函数相当于 匿名函数, 简化了函数的定义. 语言的发展 ...

  8. 虹软 Android 人脸检测与人脸识别集成分享

    目前我们的应用内使用了 ArcFace 的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得 集成ArcFace FD 的集成过程非常简单 在 ArcFace FD ...

  9. 牛客国庆集训派对Day3 I Metropolis

    Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...

  10. AtCoder Grand Contest 025 B - RGB Coloring

    B - RGB Coloring 求ax + by = k (0<=x<=n && 0<=y<=n)的方案数,最后乘上C(n, x)*C(n,y) 代码: #i ...