[Uva P11168] Airport
题目是英文的,这里就不给出来了。
题目的大意是说,在平面上有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的更多相关文章
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- UVA 11374 Airport Express SPFA||dijkstra
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 11374 Airport Express(最短路)
最短路. 把题目抽象一下:已知一张图,边上的权值表示长度.现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小. 当加上一条边a->b,如果这条边更新了最短路,那么起点st- ...
- UVA 11168 Airport(凸包)
Airport [题目链接]Airport [题目类型]凸包 &题解: 蓝书274页,要想到解析几何来降低复杂度,还用到点到直线的距离公式,之后向想到预处理x,y坐标之和,就可以O(1)查到距 ...
- UVA - 11374 Airport Express (Dijkstra模板+枚举)
Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...
- UVA 11168 Airport(凸包+直线方程)
题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然 ...
- 简单几何(数学公式+凸包) UVA 11168 Airport
题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...
- UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)
题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...
- uva 11168 - Airport
凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <alg ...
随机推荐
- toggle 1.9 以后就被删除了
toggle 1.9 以后就被删除了, 1.8.x 以前可用. $(function(){ $(".p_title").toggle( function(){ $(this).n ...
- 小程序之image图片实现宽度100%,高度自适应
哇 今天搞了半天 图片一直变形啊啊啊啊 宽度100% 高度给100% 给auto 完全不管用啊啊啊啊 然后最后最终!!!! 首先我们要给我们的图片一个100%的宽度!让它自适应!! .g ...
- BaseEditor
using UnityEngine;using System.Collections.Generic;using UnityEditor;using System.Text;using System. ...
- WebStorm破解方法
http://www.jianshu.com/p/85266fa16639 http://idea.lanyus.com/ webstorm 入门指南 破解方法 1. 下载的WebStorm http ...
- netstat 在windows下和Linux下查看网络连接和端口占用
假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址[ip+端口] 第三列:远 ...
- Python缩进与if语句 空格的魅力
缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python! ...
- OpenModelica部分库缺失问题解决
问题:写下面这段代码时,保存时没有出错,但执行时提示找不到initialState这个函数. when time > redTime then state1 := Modelica.Math.R ...
- vue-循环标记列表元素
<el-col :lg="4" class="list" v-for="(item,index) in picList"> &l ...
- Python全栈开发-Day7-面向对象编程2
本节内容: 1.面向对象高级语法部分 1)静态方法.类方法.属性方法 3)类的特殊方法 4)反射 2.异常处理 3.动态导入模块 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一 ...
- C# http监听之Nancy.net
通过winform或者是控制台应用程序监听http请求,之前使用的是微软的HttpListener,参考https://www.cnblogs.com/duanjt/p/5566336.html 然后 ...