UVA 11168 Airport(凸包+直线方程)
题意:给你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的情况
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const ll INF=1ll<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y) {};
int read()
{
scanf("%lf%lf",&x,&y);
}
inline Point operator+(const Point& a)const
{
return Point(x+a.x,y+a.y);
}
inline Point operator-(const Point& a)const
{
return Point(x-a.x,y-a.y);
}
inline bool operator<(const Point& a)const
{
return (sgn(x-a.x)<||(zero(x-a.x)&&sgn(y-a.y)<));
}
};
typedef Point Vector;
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
int ConvexHull(Point* p,int n,Point* convex)
{
sort(p,p+n);
int m=;
for(int i=;i<n;++i)
{
while(m>&&Cross(convex[m-]-convex[m-],p[i]-convex[m-])<)
--m;
convex[m++]=p[i];
}
int k=max(m,);
for(int i=n-;i>=;--i)
{
while(m>k&&Cross(convex[m-]-convex[m-],p[i]-convex[m-])<)
--m;
convex[m++]=p[i];
}
if(n>)
m--;
return m;
}
Point home[Max],convex[Max];
double Solve(int n,double sumx,double sumy)
{
if(n<=)
return ;
double minx=(double)INF;
int m=ConvexHull(home,n,convex);
double A,B,C;
for(int i=;i<=m;++i)
{
A=convex[i%m].y-convex[i-].y;
B=convex[i-].x-convex[i%m].x;
C=convex[i%m].x*convex[i-].y-convex[i-].x*convex[i%m].y;
minx=min(minx,fabs((A*sumx+B*sumy+C*n)/(sqrt(A*A+B*B))));
}
return minx;
}
int main()
{
int t,n;
int coun=;
double sumx,sumy;
scanf("%d",&t);
while(t--)
{
sumx=sumy=;
scanf("%d",&n);
for(int i=; i<n; ++i)
{
home[i].read();
sumx+=home[i].x;
sumy+=home[i].y;
}
printf("Case #%d: %.3f\n",++coun,Solve(n,sumx,sumy)/n+eps);
}
return ;
}
UVA 11168 Airport(凸包+直线方程)的更多相关文章
- UVA 11168 Airport(凸包)
Airport [题目链接]Airport [题目类型]凸包 &题解: 蓝书274页,要想到解析几何来降低复杂度,还用到点到直线的距离公式,之后向想到预处理x,y坐标之和,就可以O(1)查到距 ...
- UVA 11168 - Airport - [凸包基础题]
题目链接:https://cn.vjudge.net/problem/UVA-11168 题意: 给出平面上的n个点,求一条直线,使得所有的点在该直线的同一侧(可以在该直线上),并且所有点到该直线的距 ...
- 简单几何(数学公式+凸包) UVA 11168 Airport
题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...
- uva 11168 - Airport
凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <alg ...
- UVa 11168(凸包、直线一般式)
要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqr ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- UVa 11168 (凸包+点到直线距离) Airport
题意: 平面上有n个点,求一条直线使得所有点都在直线的同一侧.并求这些点到直线的距离之和的最小值. 分析: 只要直线不穿过凸包,就满足第一个条件.要使距离和最小,那直线一定在凸包的边上.所以求出凸包以 ...
- uva 10065 (凸包+求面积)
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...
- UVA 11374 Airport Express SPFA||dijkstra
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- 6. web前端开发分享-css,js移动篇
随着移动市场的逐步扩大及相关技术的日趋完善,对前端开发提出了新的岗位要求,在继承前人成果的基础上需要在新的历史条件下有新的创新.移动端的开发,虽然没有IE6众多问题的折磨,但是多平台,多设备的兼容,也 ...
- 20155324王鸣宇对C语言课程回顾及对Java的展望
# 第二次预备作业 你有什么技能比大多人(超过90%以上)更好? 针对这个技能的获取你有什么成功的经验? 与老师博客中的学习经验有什么共通之处? 我谦虚的说整个2015级五系英雄联盟这个游戏我最厉害( ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- MySQL收藏
MySQL手册:5.5手册 .5.6手册 cd /usr/local/mysql/bin mysql -uroot -p show processlist; // 显示系统中正在运行的所有进程 M ...
- 配置 PHP 的 Session 存储到 Redis
PHP 的会话默认是以文件的形式存在的,可以配置到 NoSQL 中,即提高了访问速度,又能很好地实现会话共享,,,爽歪歪! 配置方式如下: 方法一:修改 php.ini 的设置 session.sav ...
- Webview和Html
参考http://blog.csdn.net/chenzheng_java/article/details/6260872 <html><header> <title&g ...
- 页面解耦—— 统跳协议和Rewrite引擎
原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...
- docker版wordpress
拉取wordpress镜像 docker pull wordpress:latest 创建mysql 容器docker run --name wordpress-mysql -e MYSQL_ROOT ...
- saltstack命令执行过程
saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...
- dell md3200i mdss (企业管理) 安装的那点事儿
首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...