poj2069
poj2069
题意
求一个覆盖所有点的最小球体的半径。即求空间内一点到所有点的距离的最大值最小的点。
分析
模拟退火算法,但这道题竟然不用随机函数就能过了,主要体现了算法的渐近收敛性,
起始点随意取,然后找到相距最远的点,按比例向这个点位移,而这个比例在一定程度上是逐渐减小的,最终达到要求的精度。
即使位移后得到的点距其他点的距离增大了还是要移动到那个点,否则会错。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 33;
typedef pair<double, int> Pair;
int n;
struct P
{
double x, y, z;
P() {}
P(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
P operator - (P p)
{
return P(x - p.x, y - p.y, z - p.z);
}
double dis()
{
return sqrt(x * x + y * y + z * z);
}
} a[MAXN];
Pair getMaxDis(P p)
{
double dd = 0;
int ii = 0;
for(int i = 0; i < n; i++)
{
double tmpd;
if((tmpd = (a[i] - p).dis()) > dd)
{
dd = tmpd;
ii = i;
}
}
return Pair(dd, ii);
}
double SA()
{
P t;
t.x = 0;
t.y = 0;
t.z = 0;
double delta = 100, d = 0.98;
Pair dis = getMaxDis(t);
double maxd = dis.first;
int id = dis.second;
while(delta > 1e-7)
{
for(int j = 0; j < 1; j++) // 这样就能过了...
{
double rate = delta / maxd;
t.x += (a[id].x - t.x) * rate;
t.y += (a[id].y - t.y) * rate;
t.z += (a[id].z - t.z) * rate;
dis = getMaxDis(t);
id = dis.second;
maxd = dis.first;
}
delta *= d;
}
return maxd;
}
int main()
{
while(~scanf("%d", &n) && n)
{
for(int i = 0; i < n; i++)
{
scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].z);
}
printf("%.5f\n", SA());
}
return 0;
}
poj2069的更多相关文章
- 【模拟退火】poj2069 Super Star
题意:让你求空间内n个点的最小覆盖球. 模拟退火随机走的时候主要有这几种走法:①随机旋转角度. ②直接不随机,往最远的点的方向走,仅仅在尝试接受解的时候用概率.(最小圆/球覆盖时常用) ③往所有点的方 ...
- POJ2069 最小球覆盖 几何法和退火法
对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...
- [POJ2069]Super Star(模拟退火)
题目链接:http://poj.org/problem?id=2069 题意:求一个半径最小的球,使得它可以包围住所有点. 模拟退火,圆心每次都去找最远那个点,这样两点之间的距离就是半径,那么接下来移 ...
- POJ2069 最小球体覆盖, 模拟退火
只是套了个模板,模拟退火具体的过程真心不懂阿 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #in ...
- POJ2069:Super Star
我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...
- HDU 3007 模拟退火算法
Buried memory Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 初探 模拟退火算法 POJ2420 HDU1109
模拟退火算法来源于固体退火原理,更多的化学物理公式等等这里不再废话,我们直接这么来看 模拟退火算法简而言之就是一种暴力搜索算法,用来在一定概率下查找全局最优解 找的过程和固体退火原理有所联系,一般来讲 ...
- D.Country Meow 最小球覆盖 三分套三分套三分 && 模拟退火
// 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值. 思路 非常裸的最小 ...
随机推荐
- java多线程基本概述(四)——死锁
package mytask; public class Task { public static void main(String[] args) { DeadThread thread = new ...
- 第三章 Struts2配置详解
3.1 Struts2执行过程 1.获取Struts2资源 2.在应用程序中导入Struts2的类库 3.在web.xml中配置StrutsPrepareAndExecuteFilt ...
- margin外边距合并问题以及解决方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【转载】stm32定时器-----珍藏版
今天看到一个讲解定时器特别细致入微的文章,真是难得... 原文地址:http://www.cnblogs.com/zjvskn/p/5751591.html 一.STM32通用定时器原理 STM32 ...
- LinkCode 第k个排列
http://www.lintcode.com/zh-cn/problem/permutation-sequence/# 原题 给定 n 和 k,求123..n组成的排列中的第 k 个排列. 注意事项 ...
- 03(1) Gaussians,GMMs基础
1.单成分单变量高斯模型 2.单成分多变量高斯模型 若协方差矩阵为对角矩阵且对角线上值相等,两变量高斯分布的等值线为圆形 若协方差矩阵为对角矩阵且对角线上值不等,两变量高斯分布的等值线为椭圆形, 长轴 ...
- 使用EzHttp框架 开发基于HTTP协议的CS轻应用
框架概述 EzHttp是临时起意构思和开发的一个框架,目的在于简化CS轻应用开发过程.开发语言是C#. 普通的基于HTTP的应用开发基本上是RESTful的,客户端调用封装需要人工写代码,就算利用三方 ...
- 深入tornado中的ioLoop
本文所剖析的tornado源码版本为4.4.2 ioloop就是对I/O多路复用的封装,它实现了一个单例,将这个单例保存在IOLoop._instance中 ioloop实现了Reactor模型,将所 ...
- Laravel 5.2 教程 - 队列
一.简介 Laravel 队列组件提供一个统一的 API 集成了许多不同的队列服务,队列允许你延后执行一个耗时的任务,例如延后至指定的时间才发送邮件,进而大幅的加快了应用程序处理请求的速度. 由于本例 ...
- JS面向对象,创建,继承
很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...