题目传送门

题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短。

分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为Ax + By + C = 0.点(x0, y0)到直线的距离为:fabs(Ax0+By0+C)/sqrt(A*A+B*B)。

所以只要先求出x的和以及y的和,能在O (1)计算所有距离和。

两点式直线方程p1 (x1, y1),p2 (x2, y2)转换成一般式直线方程:A = y1 - y2, B = x2 - x1, C = -A * x1 - B * y1;

/************************************************
* Author        :Running_Time
* Created Time  :2015/11/10 星期二 11:24:09
* File Name     :UVA_11168.cpp************************************************/#include <bits/stdc++.h>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = acos (-1.0);
int dcmp(double x)  {if (fabs (x) < EPS) return 0;else    return x < 0 ? -1 : 1;
}
struct Point    {double x, y;Point () {}Point (double x, double y) : x (x), y (y) {}Point operator - (const Point &r) const {       //向量减法return Point (x - r.x, y - r.y);}Point operator * (double p) const {       //向量乘以标量return Point (x * p, y * p);}Point operator / (double p) const {       //向量除以标量return Point (x / p, y / p);}Point operator + (const Point &r) const {return Point (x + r.x, y + r.y);}bool operator < (const Point &r) const {return x < r.x || (x == r.x && y < r.y);}bool operator == (const Point &r) const {return dcmp (x - r.x) == 0 && dcmp (y - r.y) == 0;}
};
typedef Point Vector;
Point read_point(void)  {double x, y;    scanf ("%lf%lf", &x, &y);return Point (x, y);
}
double dot(Vector A, Vector B)  {       //向量点积return A.x * B.x + A.y * B.y;
}
double cross(Vector A, Vector B)    {       //向量叉积return A.x * B.y - A.y * B.x;
}
double length(Vector V) {return sqrt (dot (V, V));
}
vector<Point> convex_hull(vector<Point> ps) {sort (ps.begin (), ps.end ());ps.erase (unique (ps.begin (), ps.end ()), ps.end ());int n = ps.size (), k = 0;vector<Point> qs (n * 2);for (int i=0; i<n; ++i) {while (k > 1 && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-2]) <= 0)    k--;qs[k++] = ps[i];}for (int t=k, i=n-2; i>=0; --i) {while (k > t && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-2]) <= 0)    k--;qs[k++] = ps[i];}qs.resize (k-1);return qs;
}double sqr(double x)    {return x * x;
}int main(void)    {int T, cas = 0;  scanf ("%d", &T);while (T--) {int n;  scanf ("%d", &n);vector<Point> ps;double x, y, sx = 0, sy = 0;for (int i=0; i<n; ++i) {scanf ("%lf%lf", &x, &y);sx += x;    sy += y;ps.push_back (Point (x, y));}vector<Point> qs = convex_hull (ps);if ((int) qs.size () <= 2)  {printf ("Case #%d: %.3f\n", ++cas, 0.0);    continue;}double mn = 1e9;qs.push_back (qs[0]);for (int i=0; i<qs.size ()-1; ++i)    {double A = qs[i].y - qs[i+1].y;double B = qs[i+1].x - qs[i].x;double C = -A * qs[i].x - B * qs[i].y;double tmp = fabs (A * sx + B * sy + n * C) / sqrt (sqr (A) + sqr (B));if (mn > tmp)   mn = tmp;}printf ("Case #%d: %.3f\n", ++cas, mn / n);}//cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4953133.html

简单几何(数学公式+凸包) UVA 11168 Airport相关推荐

  1. UVA 11168 - Airport 凸包

    点击打开链接 Problem D Airport Input: Standard Input Output: Standard Output It is no coincidence  that in ...

  2. UVa 11168 Airport , 凸包

    题意: 给出平面上n个点,找一条直线,使得全部点在直线的同側.且到直线的距离之平均值尽量小. 先求凸包 易知最优直线一定是凸包的某条边,然后利用点到直线距离公式进行计算. #include<cs ...

  3. 简单几何(推公式) UVA 11646 Athletics Track

    题目传送门 题意:给了长宽比例,操场一圈400米,问原来长宽的长度 分析:推出公式 /************************************************ * Author ...

  4. python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  5. Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包括点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义.图像的一个像素点有1或者3个值,对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值,他们表现出不 ...

  6. 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】

    一.实验内容.目的.要求 1.简单几何形体(三角形.多边形等)的平移.缩放.旋转等几何变换. 2.掌握相关算法的原理及实现 3.实现基础代码(非调用OpenGL等图形库): 缩放.旋转等能指定变换参考 ...

  7. 2021牛客暑期多校训练营2 F Girlfriend (阿波罗尼斯圆+简单几何)

    F Girlfriend (阿波罗尼斯球+简单几何) 题目大意: 给定四个点,每两个点构成一个阿波罗尼斯球,求两圆相交部分的体积. 思路: 一看就是几何题啊,话不多说直接开淦... 首先对于阿波罗尼斯 ...

  8. UVA - 11437 Triangle Fun(简单几何)

    题目链接:点击查看 题目大意:给出三个顶点A,B,C组成三角形,如题目中的图片所示,规定D,E,F分别为三条边的三等分点,现在要求三角形RPQ的面积 题目分析:利用向量先求出DEF三点,再利用线段相交 ...

  9. 密位测距离口诀_快速测距法(含简单几何说明)

    在 题目:远处两个山头在地图上显示距离为2公里,你拿起指北针量了一下,知道它们的密位夹角为100个密位,请问你距离它们多远? 先聊一下算法的历史,再说怎么算: 1936年在伊拉克巴格达附近(古巴比伦, ...

最新文章

  1. 留意2021年比较热门的5种AI工作技能
  2. linux 进程数量限制,LINUX下每进程限制线程数量
  3. Android Studio中安装OpenCV SDK
  4. c++检测ip是否匹配子网掩码_网络工程师从入门到精通通俗易懂系列 | ARP和IP这篇文章讲的相当详细了,这么基础的知识往往也是最容易遗忘的!...
  5. sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。...
  6. Linux学习笔记(二):cd命令的使用
  7. 送出15个Google Wave邀请,需要的赶快
  8. php二叉排序树,二叉排序树(建树)
  9. 《网络基础》- 第3集-IP地址、子网掩码和路由器的作用
  10. Mysql JSON对象和JSON数组查询
  11. 拼多多、小米、美团等科技公司为何急上市?
  12. 十本数据结构与算法书籍推荐
  13. Java实现 LeetCode 480 滑动窗口中位数
  14. 牛客网利用C语言解兔子序列
  15. PyTorch 在 Windows 10 系统下的环境配置及安装
  16. CTF线下AWD攻防步骤总结
  17. poj 3067 树状数组
  18. android获取手机资源文件,android MediaStore 读取手机文件
  19. 2022年未来网络与通信专题讲座(南京专技人员继续教育)
  20. BZOJ_4327_JSOI2012 玄武密码_AC自动机

热门文章

  1. Python int()函数
  2. 讯飞语音合成andriod版本
  3. 跟着换屏哥手机维修工程师,轻松排除iphone手机小故障
  4. 关于如何创业的书籍推荐
  5. Monolog-PHP日志类库
  6. 无线网络2.4G与5.0G的区别
  7. ajax轮询需要注意的地方
  8. 一文带你彻底拿下a,b两点间等效电阻
  9. 在英语编程比赛中如何既快又准地看懂题目意思
  10. python安装第三方模块