最小圆覆盖

ccut-ry ccut-ry     2022-12-31     457

关键词:

求一个半径最小的圆使其内部至少包含 m 个点

#include <bits/stdc++.h>
using namespace std;
 
#define Mn 305
const double eps = 1e-7;
const double pi = acos(-1.0);
struct Point

	double x,y;
	Point() 
	Point(double tx,double ty)
	
		x=tx;
		y=ty;
	
 p[Mn+5];
struct Node

	double angle;
	bool in;
 arc[Mn * Mn + 5];
int n;
double dist(Point p1,Point p2)

	return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));

bool cmp(Node &n1,Node &n2)

	return n1.angle<n2.angle;

double R;
 
int MaxCircleCover()

    int ans=1;
    for(int i=0;i<n;i++)
	
        int cnt=0;
        for(int j=0;j<n;j++)
		
            if(i==j) continue;
            double D = dist(p[i],p[j]);
            if(D>2.0*R) continue;
            
            double angle=atan2(p[i].y-p[j].y,p[i].x-p[j].x);
            if(angle < 0)
                angle += 2 * pi;
                
            double phi=acos(D/(2.0*R));
            arc[cnt].angle=angle-phi+ 2 * pi;arc[cnt++].in=true;
            arc[cnt].angle=angle+phi+ 2 * pi;arc[cnt++].in=false;
        
        sort(arc,arc+cnt,cmp);
        int tmp=1;
        for(int j=0;j<cnt;j++)
		
            if(arc[j].in)  tmp++;
            else tmp--;
            ans=max(ans,tmp);
        
    
    return ans;

 
int main()

	int t;scanf("%d",&t);
	while(t--)
	
		int s;
		scanf("%d%d",&n,&s);
		for(int i=0;i<n;i++)
			scanf("%lf%lf",&p[i].x,&p[i].y);
		double r;
		scanf("%lf",&r);
		double l1=0,r1=100000;	
		while(abs(r1-l1)>eps)
		
			double mid=(l1+r1)*0.5;
			R=mid;
			int p=MaxCircleCover();
			if(p>=s)
			
				r1=mid;
			
			else
			
				l1=mid;
			
		
		printf("%.4lf
",l1+r);
	
	return 0;

 

java案例:最小覆盖圆问题

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

最小圆覆盖

求一个半径最小的圆使其内部至少包含m个点#include<bits/stdc++.h>usingnamespacestd;#defineMn305constdoubleeps=1e-7;constdoublepi=acos(-1.0);structPoint doublex,y; Point() Point(doubletx,doublety) x=tx; y=ty; 查看详情

mapletrees(最小覆盖圆)

MapletreesTimeLimit:1000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):222AcceptedSubmission(s):79 ProblemDescriptionTherearealotoftreesinHDU.Kikiwanttosurroundallthe 查看详情

最小圆覆盖

1structPoint{doublex,y;};2structCircle{Pointc;doubler;};3doubledist(Pointa,Pointb){4returnsqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));5}6Circlecalc(Pointp1,Pointp2,Pointp3){7Circletemp;8doublea,b,c, 查看详情

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

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

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

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

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

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

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

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

bzoj1336[balkan2002]alien最小圆覆盖随机增量法

【BZOJ1336】[Balkan2002]Alien最小圆覆盖Description给出N个点,让你画一个最小的包含所有点的圆。Input先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)Output输出圆的半径,及圆心的坐标SampleInput68.09.04.07.51.02.05.... 查看详情

hdu3007最小圆覆盖-随机增量法

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintN=505;intn;doubler;structdiandoublex,y;dian(doubleX=0,doubleY=0)x=X,y=Y;dianope 查看详情

bzoj1336/1337/2823[balkan2002]alien最小圆覆盖随机增量法

题目描述给出N个点,让你画一个最小的包含所有点的圆。输入先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)输出输出圆的半径,及圆心的坐标样例输入68.09.04.07.51.02.05.18.79.02.04.51.0样例输出5.005.005.00题... 查看详情

[matlab]10.最小覆盖圆(代码片段)

clearall;closeall;clc;n=100;p=rand(n,2);p1=p(1,:);%取第一行的值P1点p2=p(2,:);%取第二行的值P2点r=sqrt((p1(1)-p2(1))^2+(p1(2)-p2(2))^2)/2;%求两点半径cenp=(p1+p2)/2;%求两点中点fori=3:nnewp=p(i,:);%从第三行开始储存新的点d=sqrt((cenp(1)-new 查看详情

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

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

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

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

bzoj2280[poi2011]plot二分+倍增+二分+最小圆覆盖

...求一个点q_i,使得q_i到这段内点的距离的最大值的最大值最小输入第一行,nm下面n行,每行两个整数,表示p_i的xy坐标1<=m<=n<=100000坐标范围[-1000000,1000000] 0<p,q,r<=150,输入中至少包含一个’N’ 查看详情

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

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

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

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

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

#include<bits/stdc++.h>#defineLLlonglong#definefifirst#definesesecond#definemkmake_pair#definePLLpair<LL,LL>#definePLIpair<LL,int>#definePIIpair<int,int>#defineSZ(x)((int)x.size())#defineullunsignedlonglongusingnamespacestd;constintN=2e5+7;constintinf=0x3f3f3f3f;constLLINF=0x... 查看详情