【BZOJ】【P1337】【最小圆覆盖】【题解】【随机增量法】

本文详细介绍了使用C++编程语言通过随机数生成器来创建点,并计算这些点到指定集合中其他点的距离的过程。通过实现一个算法,我们可以生成随机点并找出最接近集合中某个点的点。此过程涉及随机数生成、距离计算和迭代优化,旨在找到最短距离。代码示例展示了如何使用标准库函数和自定义函数来完成这一任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1337

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
const double eps=1e-8;
double r,rx,ry,x,y;
double p[maxn][2];
int n;
double rnd(){
	return (double)rand()/RAND_MAX;
}
double sqr(double x){
	return x*x;
}
double dist(double x,double y){
	double ans=0;
	for(int i=1;i<=n;i++)
	ans=max(ans,sqrt(sqr(x-p[i][0])+sqr(y-p[i][1])));
	return ans;
}
int dcmp(double x){
	if(fabs(x)<eps)return 0;
	return x>0?1:-1;
}
int main(){
	srand(33323);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i][0],&p[i][1]);
	x=p[1][0];y=p[1][1];
	r=99999999;double ans=dist(x,y);
	while(r>eps){
		int m=50;
		while(m--){
			rx=(rnd()*2-1)*r;
			ry=sqrt(sqr(r)-sqr(rx))*(rnd()*4-1);
			double res=dist(x+rx,y+ry);
			if(dcmp(res-ans)<0){
				ans=res;
				x+=rx;y+=ry;
			}	
		}r=r/1.5;
	}printf("%.3lf\n",ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值