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 个点的距离最大值的最小值. 思路 非常裸的最小 ...
随机推荐
- 【模板】Dijkstra的heap优化
为了将最小费用最大流的spfa优化,决定将spfa换成heap优化的Dijkstra.(dijkstra不能处理负边权) 所以还得现学... 白点表示已经确定最短路径的点. 蓝点表示还未确定最短路径的 ...
- .Net MVC4笔记之js css引用与压缩
1.引用时,可以用即可以直接使用“~”来表示根目录. 引入js 引入js 引入css <link href="~/Content/uploadify/uploadify.css&quo ...
- vim粘贴代码问题
vim粘贴代码问题 vim 在使用xshell进行vim操作的时候,经常会直接粘贴一些外部的代码,然后粘贴上之后会出现逐行缩进的情况,之前一直没有去找为啥,并且逐行的给他弄回去. 转自:https:/ ...
- 关于css禁止文本复制属性
最近在做DHTMLX框架替换,新框架dhx的grid是不能选中内容复制的 虽然相对来说是安全些的,但是客户体验度一定会大打折扣 网页上禁止复制主要靠JavaScript来实现.<BODY onc ...
- wow.js中各种特效对应的类名
一.(页面在向下滚动的时候,有些元素会产生细小的动画效果.虽然动画比较小,但却能吸引你的注意.) 刚知道wow.js这个插件,之前访问别的网站下拉滚动条会出现各种效果感觉特别神奇,现在自己依葫芦画瓢也 ...
- ajax发送异步请求
一:得到XMLHttpRequest对象 ajax其实只需要学习XMLHttpRequest一个对象 大多数浏览器都支持: var xmlHttp = new XMLHttprequest(); IE ...
- 2017/4/25-SAX解析XML文件
SAX解析XML 1.分析 SAX是按照XML文件的顺序执行,可以说是边扫描,边解析.所以无须将整个文件加载至内存中. 2.优点 1)占用内存少. 2)解析效率高. 3.缺点 1)只能进行读取. 2) ...
- 纯JS单页面赛车游戏代码分享
分享一个以前写的小游戏,纯js游戏,代码很简单.欢迎大家来喷呦! 效果图: 代码展示://直接复制到html文件即可 支持IE9+版本 <!DOCTYPE html> <html&g ...
- Java项目中的一些注意事项
一.关于包命名方式 例如:com.sun.spring.xxx.service.impl 第一级:公司域名的倒序com.sun 第二级:项目名称spring 第三级:模块信息xxx 第四级:功能顶层包 ...
- 导出Mysql数据库中的数据
使用mysqldump 指令: D:\>mysqldump -u root -proot bookStore>bookStore.sql