UVa 11168(凸包、直线一般式)】的更多相关文章

题意: 平面上有n个点,求一条直线使得所有点都在直线的同一侧.并求这些点到直线的距离之和的最小值. 分析: 只要直线不穿过凸包,就满足第一个条件.要使距离和最小,那直线一定在凸包的边上.所以求出凸包以后,枚举每个边求出所有点到直线的距离之和得到最小值. 点到直线距离公式为: 因为点都在直线同一侧,所以我们可以把加法“挪”到里面去,最后再求绝对值,所以可以预处理所有点的横坐标之和与纵坐标之和.当然常数C也要记得乘上n倍. 已知两点坐标求过该点直线的方程,这很好求不再赘述,考虑到直线没有斜率的情况,…
要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqrt {A^2+B^2}}\)\(O(1)\)算出总距离 #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #i…
题意:给你n[1,10000]个点,求出一条直线,让所有的点都在都在直线的一侧并且到直线的距离总和最小,输出最小平均值(最小值除以点数) 题解:根据题意可以知道任意角度画一条直线(所有点都在一边),然后平移去过某个点,再根据此点进行旋转直到过另一个点,这样直线就被两个点确定了 而这样的直线一定是这些点形成的凸包的边,接着就是求出凸包后枚举每条凸包的边,再根据这条边找到所有点到这条边的距离总和 但是直接找会超时,那么我们用方程优化: 已知直线上的两点P1(X1,Y1) P2(X2,Y2), P1…
题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南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…
题意:给出平面上的n个点,求一条直线,使得所有点在该直线的同一侧且所有点到该直线的距离和最小,输出该距离和. 思路:要使所有点在该直线的同一侧,明显是直接利用凸包的边更优.所以枚举凸包的没条边,然后求距离和.直线一般式为Ax + By + C = 0.点(x0, y0)到直线的距离为 fabs(Ax0+By0+C)/sqrt(A*A+B*B).由于所有点在直线的同一侧,那么对于所有点,他们的(Ax0+By0+C)符号相同,显然可以累加出sumX和sumY,然后统一求和. 水.... #inclu…
Airport [题目链接]Airport [题目类型]凸包 &题解: 蓝书274页,要想到解析几何来降低复杂度,还用到点到直线的距离公式,之后向想到预处理x,y坐标之和,就可以O(1)查到距离,还是很厉害的. 但我还是不知道为什么最后输出ans要除n?希望大佬看见可以评论告诉我一下. &代码: #include <iostream> #include <cstdio> #include <algorithm> #include <cmath>…
题目链接:https://cn.vjudge.net/problem/UVA-11168 题意: 给出平面上的n个点,求一条直线,使得所有的点在该直线的同一侧(可以在该直线上),并且所有点到该直线的距离和最小,输出该距离除以n: 题解: 显然最好能让越多的点在这条直线上就越好,但又要所有点满足在同侧,则显然要选取某条凸包边界所在直线作为ans: 求出凸包后,遍历每条凸包边,求出所有点到这条直线的距离和,找到最小的即可. AC代码: #include<bits/stdc++.h> #define…
凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #define eps 1e-9 using namespace std; ); int dcmp(double x) { : (x > ? : -); } struct Point { double x; double y; Poi…
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1593 #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<queue&…
题目大意: 要完成两种属性p,q的需求,给定n个双属性物品及其单位个物品中含有的属性,要求选择最少的物品来达成属性需求.(可以选择实数个物品) 题解: 实际上是一种属性混合问题 我们知道对于两种双属性物品,按照一定比例融合 可以配置出的物品的属性在二维平面上的分布一定是一条直线 而这条直线由最初的双属性物品所对应的点坐标所确定 扩展到三个物品,我们发现所有可配置的物品构成了一个三角形 扩展到n个物品,我们发现这n个点构成的凸包内的物品一定都可以配置 所以我们求出凸包来 然后我们从原点想我们的需求…