uva11168

题意

给出一些点坐标,选定一条直线,所有点在直线一侧(或直线上),使得所有点到直线的距离平均值最小。

分析

显然直线一定会经过某两点(或一点),又要求点在直线某一侧,可以直接求出凸包,枚举每条边作为直线。

现在就要快速求出所有点到直线的距离,有求点到直线距离方程 \(\frac{|Ax_0 + By_0 + C|}{\sqrt{A^2+B^2}}\),注意所有点都在直线同一侧,所有 \(Ax_0 + By_0 + C\) 正负号相同,预处理出所有点横、纵坐标之和即可。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double INF = 1e18;
const int MAXN = 2e4 + 10;
struct Point {
double x, y;
Point(double x = 0, double y = 0) : x(x), y(y) {}
bool operator < (const Point& p1) const {
if(x == p1.x) return y < p1.y;
return x < p1.x;
}
void read_point() {
scanf("%lf%lf", &x, &y);
}
};
double Cross(Point p1, Point p2) {
return p1.x * p2.y - p1.y * p2.x;
}
Point operator - (Point p1, Point p2) {
return Point(p1.x - p2.x, p1.y - p2.y);
}
int ConvexHull(Point* p, int n, Point* ch) {
sort(p, p + n);
int m = 0;
for(int i = 0; i < n; i++) {
while(m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--;
ch[m++] = p[i];
}
int k = m;
for(int i = n - 2; i >= 0; i--) {
while(m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--;
ch[m++] = p[i];
}
if(n > 1) m--;
return m;
}
// (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)
// 得到直线 p1-p2 : A * x + B * y + C = 0
// 设 f(x, y) = A * x + B * y + C
// 若 f(x, y) < 0 表示点 (x, y) 在直线的左边(此时可把 p1-p2 当作向量)
void getLine(Point p1, Point p2, double& A, double& B, double& C) {
A = p2.y - p1.y; B = p1.x - p2.x; C = Cross(p2, p1);
} Point p[MAXN], ch[MAXN];
int main() {
int kase = 1, T;
scanf("%d", &T);
while(T--) {
int n;
double X = 0, Y = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
p[i].read_point();
X += p[i].x;
Y += p[i].y;
}
int m = ConvexHull(p, n, ch);
double ans = INF;
for(int i = 0; i < m; i++) {
double A, B, C;
getLine(ch[i], ch[(i + 1) % m], A, B, C);
ans = min(ans, fabs(A * X + B * Y + C * n) / hypot(A, B) / n);
}
if(ans == INF) ans = 0;
printf("Case #%d: %.3f\n", kase++, ans);
}
return 0;
}

最新文章

  1. struts2+spring+hibernate(SSH)框架的搭建和总结
  2. IOS网络第五天 AFN-01发送get和post请求
  3. Texture Atlas
  4. 【UWP】FlipView绑定ItemsSource,Selectedindex的问题
  5. MySQL基础学习之数据表
  6. 自适应网页设计(Responsive Web Design)(转)
  7. 查看syslog-ng内存,兼容容器情况
  8. eclipse安装egit上传和clone项目到github
  9. UVA 1411 - Ants(二分图完美匹配)
  10. 山西大同大学教务处教师端——可在PC端,手机端操作
  11. SQL Server get SP parameters and get output fields type information
  12. java算法02 - 树
  13. 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )
  14. java 虹软ArcFace 2.0,java SDK使用-进行人脸检测
  15. Vue-axios快速上手(转)
  16. apicloud模块开发知识点
  17. poj2082 Terrible Sets(单调栈)
  18. python测试开发django-33.admin后台一对一关系OneToOneField
  19. Linux下Tomcat同时部署两个工程然而只有一个能访问问题
  20. BZOJ1907 树的路径覆盖

热门文章

  1. P1717 钓鱼
  2. Conjugate 解题报告
  3. NOI2018 D1T1 [NOI2018]归程 解题报告
  4. CSS3不遥远,几个特性你要知道
  5. AnnotationConfigApplicationContext.的用法的核心代码
  6. bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
  7. C# new override
  8. Ubuntu gnome 16.04下的一些个人配置
  9. bzoj1578 [Usaco2009 Feb]Stock Market 股票市场
  10. C++ 迭代器容器学习