最小圆覆盖gym-102006i(代码片段)

cjlhy cjlhy     2023-02-16     244

关键词:

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long
using namespace std;

const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1.1e-4;
const  double PI = acos(-1);

struct Point 
    double x, y;
    Point(double x = 0, double y = 0) : x(x), y(y)  
;
typedef Point Vector;

int dcmp(double x) 
    if(fabs(x) < eps) return 0;
    else return x < 0 ? -1 : 1;


Point operator + (Vector A, Vector B) return Point(A.x + B.x, A.y + B.y);
Point operator - (Vector A, Vector B) return Point(A.x - B.x, A.y - B.y);
Point operator * (Vector A, double p) return Point(A.x * p, A.y * p);
Point operator / (Vector A, double p) return Point(A.x / p, A.y / p);
bool operator < (const Vector &A, const Vector &B) return A.y < B.y || (A.y == B.y && A.x < B.x);
bool operator == (const Vector &A, const Point &B) return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0;
double Dot(Vector A, Vector B) return A.x * B.x + A.y * B.y;
double Length(Vector A) return sqrt(Dot(A, A));
double Angle(Vector A, Vector B) return acos(Dot(A, B) / Length(A) / Length(B));
double Cross(Vector A, Vector B) return A.x * B.y - A.y * B.x;
double Area2(Point A, Point B, Point C) return Cross(B - A, C - A);

Vector Rotate(Vector A, double rad) 
    return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));


double dist(const Point& a, const Point &b) 
    return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));


int n;
double r, R;
Point p[N];

Point GetCircleCenter(Point A, Point B, Point C) 
    Point o;
    double a1 = B.x-A.x, b1 = B.y-A.y, c1 = (a1*a1+b1*b1)/2;
    double a2 = C.x-A.x, b2 = C.y-A.y, c2 = (a2*a2+b2*b2)/2;
    double d = a1*b2-a2*b1;
    o.x=A.x+(c1*b2-c2*b1)/d;
    o.y=A.y+(a1*c2-a2*c1)/d;
    return o;


void MinPointCoverByCircle(Point *p, int n, Point &o, double &r) 
    random_shuffle(p, p+n);
    o = p[0], r = 0;
    for(int i = 1; i < n; i++) 
        if(dist(p[i], o) > r + eps) 
            o = p[i]; r = 0;
            for(int j = 0; j < i; j++) 
                if(dist(p[j], o) > r + eps) 
                    o.x = (p[i].x+p[j].x)/2;
                    o.y = (p[i].y+p[j].y)/2;
                    r = dist(p[j], o);
                    for(int k = 0; k < j; k++) 
                        if(dist(p[k], o) > r + eps) 
                            o = GetCircleCenter(p[i], p[j], p[k]);
                            r = dist(p[i], o);
                        
                    
                
            
        
    


int main() 
//    freopen("robots.in", "r", stdin);
    int T; scanf("%d", &T);
    while(T--) 
        scanf("%d%lf%lf", &n, &R, &r); n++;
        p[0] = Point(0, 0);
        for(int i = 1; i < n; i++) 
            double x, y; scanf("%lf%lf", &x, &y);
            p[i] = p[i-1] + Point(x, y);
        
        sort(p, p+n);
        n = unique(p, p+n)-p;
        Point o;
        MinPointCoverByCircle(p, n, o, r);
        printf("%.12f %.12f
", -o.x, -o.y);
    
    return 0;

/*
*/

 

bzoj2823:[ahoi2012]信号塔&&1336:[balkan2002]alien最小圆覆盖&&1337:最小圆覆盖(代码片段)

首先我写了个凸包就溜了这是最小圆覆盖问题,今晚学了一下先随机化点,一个个加入假设当前圆心为o,半径为r,加入的点为i若i不在圆里面,令圆心为i,半径为0再重新从1~i-1不停找j不在圆里面,令圆心为ij中点,直径为ij距... 查看详情

luogup1742最小圆覆盖(代码片段)

最小圆覆盖主要是我太菜了不会证明qwq,上面的博客讲的非常好。主要是存代码:#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;constintN=100009;constdoublee 查看详情

bzoj1337最小圆覆盖(代码片段)

bzoj1337最小圆覆盖补充一个求三角形外心的向量法.用了点积的几何意义,很实用.出处.使用随机增量法求.首先随机打乱顺序,然后三重循环,选择当前在圆外的点更新圆,分别按照(1/2/3)个点确定圆的方式更新即可.由于随机一个点不在... 查看详情

c案例:最小覆盖圆问题(代码片段)

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查... 查看详情

c案例:最小覆盖圆问题(代码片段)

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查... 查看详情

c案例:最小覆盖圆问题(代码片段)

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查... 查看详情

覆盖点问题总结(代码片段)

1.最小的包围圆,将所有的点包围起来。(hdu3932)最小覆盖圆算法地址:http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066问题的背景提出:考察固定在工作平台上的一直机械手,要捡起散落在不同位置的多个零件,并送到别的地方。那么,... 查看详情

java案例:最小覆盖圆问题

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查看结果一、提出任务-最小覆盖圆(一)描述给出平面上N(N≤1... 查看详情

java案例:最小覆盖圆问题

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查看结果一、提出任务-最小覆盖圆(一)描述给出平面上N(N≤1... 查看详情

java案例:最小覆盖圆问题

文章目录一、提出任务-最小覆盖圆(一)描述(二)输入(三)输出(四)样例输入输出二、完成任务(一)编程思路(二)编写代码,实现功能(三)运行程序,查看结果一、提出任务-最小覆盖圆(一)描述给出平面上N(N≤1... 查看详情

做题poi2011r1-plot——最小圆覆盖&倍增(代码片段)

...将其划分成不超过(m)段连续的区间,使得所有每个区间的最小圆覆盖的半径的最大值最小。输出这个最小化的最大值和方案(圆心)。(n,mleq10^5)显然要二分答案。然后,一个区间就是越长越好。首先,考虑最小圆覆盖(O(n))的随机... 查看详情

模板最小圆覆盖——bzoj1336(代码片段)

博客链接https://blog.csdn.net/commonc/article/details/52291822#include<bits/stdc++.h>usingnamespacestd;#defineN100005typedefdoubledb;constdbeps=1e-10;constdbpi=acos(-1);intsign(dbk)if(k>eps)return1;elseif(k<-eps)return-1;return0;intcmp(dbk1,dbk2)returnsign(k1-k2);intinmid(dbk1,dbk2,d... 查看详情

[balkan2002]alien最小圆覆盖(代码片段)

传送门期望(O(n))的神奇算法代码:#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;voidread(int&x)charch;boolok;for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;for(x=0;isdigit(ch);x=x*10+ch-'0'... 查看详情

最小路径覆盖问题(代码片段)

嘟嘟嘟 这里就讲怎么做……因为为什么这么做以及证明我都不知道……首先,我们将原图的每一个点i都拆成i和i+n两个点。接着把所有i都和源点相连,边的容量为1,;把所有i+n都和汇点相连,容量也为1。然后对于原图中的一... 查看详情

最小路径覆盖(代码片段)

 最小不可交路径覆盖 题目链接:https://www.luogu.org/problemnew/show/P2764 题解:  如何建模? 把每个点i拆成xi和yi两个点。若i与j间有边,就链接xi与yj,求两个集合的最大匹配。  证明: 我们可以把一开始的点每个点... 查看详情

p1742最小圆覆盖(代码片段)

(color#0066ff题目描述)给出N个点,让你画一个最小的包含所有点的圆。(color#0066ff输入格式)先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)(color#0066ff输出格式)输出圆的半径,及圆心的坐标,保留10位小数(c... 查看详情

最小权顶点覆盖问题(代码片段)

最小权顶点覆盖问题键盘输入,控制台输出importjava.util.*;publicclassMainstaticintn,m;//顶点数和边数staticint[]w;//权值staticint[]cover_in=newint[10000];//是否覆盖staticint[][]connect=newint[10000][10000];//边的标记staticinttw=0,bestW=Integer.MAX... 查看详情

bzoj1185[hnoi2007]最小矩形覆盖:凸包+旋转卡壳(代码片段)

...意:  给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积。 题解:  先找出凸包,然后旋转卡壳。  在旋转卡壳中有一个结论:最小覆盖矩形一定有一条边在凸包上。  所以先枚举矩形在凸包上的那条边(p... 查看详情