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;
}

uva11168的更多相关文章

  1. UVA11168 Airport

    题意 PDF 分析 首先发现距离最短的直线肯定在凸包上面. 然后考虑直线一般方程\(Ax+By+C=0\),点\((x_0,y_0)\)到该直线的距离为 \[ \frac{|Ax_0+By_0+C|} ...

  2. UVA 11168 - Airport - [凸包基础题]

    题目链接:https://cn.vjudge.net/problem/UVA-11168 题意: 给出平面上的n个点,求一条直线,使得所有的点在该直线的同一侧(可以在该直线上),并且所有点到该直线的距 ...

随机推荐

  1. BZOJ4476 送礼物

    这道题真是有趣呀. 其实就是一个分数规划问题,用一个二分加log来得去掉分母. 分四种情况讨论 1.lenth > L && num ( max ) > num ( min ...

  2. table表头固定问题

    table表头固定问题 原生的table表头在表格滚动时候无法固定,可以使用以下的方法进行模拟 1. 双table法 表头和表体各用一个table,这样会产生表格列对不齐的问题,可以使用colgrou ...

  3. 【BZOJ 4034】[HAOI2015]树上操作 差分+dfs序+树状数组

    我们只要看出来这道题 数组表示的含义就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以 ...

  4. spring事务不回滚 自己抛的异常

    在service代码中   throw new Excepion("自定义异常“) 发现没有回滚, 然后百度了下, 改为抛出运行时异常  throw new RuntimeException ...

  5. [hdu 1398]简单dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1398 看到网上的题解都是说母函数……为什么我觉得就是一个dp就好了,dp[i][j]表示只用前i种硬币 ...

  6. DSP投放进阶指南

  7. SynchronizationContext.Post方法 代替

    http://www.codeproject.com/KB/threads/SynchronizationContext.aspx看吧,不好,就将就的看下我的吧,呵呵!(没有直接翻译,不过大概的思路相 ...

  8. dbcp基本配置和重连配置

    转载自:http://agapple.iteye.com/blog/772507 最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了. 1. 引入dbcp (选择1.4) Java代码  ...

  9. SpringMVC学习 -- REST

    REST:表现层状态转化. REST 是目前最流行的一种互联网软件架构.他结构清晰.符合标准.易于理解.扩展方便 , 所以正得到越来越多网站的采用. 状态转化:浏览器 form 表单只支持 GET 和 ...

  10. 常用原生客户端js

    var el = document.createElement('pre'); // 创建 <pre></pre>元素 el.id = 'sss'; // 添加id <p ...