我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html

我对爬山的理解:https://www.cnblogs.com/AKMer/p/9555215.html

题目传送门:http://poj.org/problem?id=2069

这题和求费马点没啥多大区别……就是把二维改成三维了,然后原本求距离和改成求最远距离了。

如果你不知道费马点是啥的话可以去看看这篇博客:

POJ2420 A Star not a Tree?:https://www.cnblogs.com/AKMer/p/9594350.html

时间复杂度:\(O(能A)\)

空间复杂度:\(O(能A)\)

爬山算法代码如下:

#include <cmath>
#include <ctime>
#include <cstdio>
#include <algorithm>
using namespace std; #define sqr(a) ((a)*(a)) int n;
double ansx,ansy,ansz,ans; struct point {
double x,y,z;
}p[35]; double len() {
double x=rand()%200000-100000;
return x/100000;
} double dis(double x1,double y1,double z1,double x2,double y2,double z2) {
return sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
} double calc(double x,double y,double z) {
double tmp=0;
for(int i=1;i<=n;i++)
tmp=max(tmp,dis(x,y,z,p[i].x,p[i].y,p[i].z));//改成取max
if(tmp<ans)ans=tmp;
return tmp;
} int main() {
srand(time(0));
while(~scanf("%d",&n)) {
if(!n)break;ans=1e18;
ansx=0,ansy=0,ansz=0;
for(int i=1;i<=n;i++) {
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
ansx+=p[i].x,ansy+=p[i].y,ansz+=p[i].z;
}ansx/=n,ansy/=n,ansz/=n;
double now_x=ansx,now_y=ansy,now_z=ansz;
for(double T=1e7;T>=1e-7;T*=0.998) {
double nxt_x=now_x+len()*T;
double nxt_y=now_y+len()*T;
double nxt_z=now_z+len()*T;
if(calc(nxt_x,nxt_y,nxt_z)<calc(now_x,now_y,now_z))
now_x=nxt_x,now_y=nxt_y,now_z=nxt_z;
}printf("%.5lf\n",ans);
}
return 0;
}

模拟退火代码如下:

#include <cmath>
#include <ctime>
#include <cstdio>
#include <algorithm>
using namespace std; #define sqr(a) ((a)*(a)) const double T_0=1e-7;
const double del_T=0.998; int n;
double ansx,ansy,ansz,ans; struct point {
double x,y,z;
}p[35]; double len() {
double x=rand()%200000-100000;
return x/100000;
} double dis(double x1,double y1,double z1,double x2,double y2,double z2) {
return sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
} double calc(double x,double y,double z) {
double tmp=0;
for(int i=1;i<=n;i++)
tmp=max(tmp,dis(x,y,z,p[i].x,p[i].y,p[i].z));
if(tmp<ans)ans=tmp;
return tmp;
} void Anneal() {
double T=1e7,now_x=ansx,now_y=ansy,now_z=ansz;
while(T>=T_0) {
double nxt_x=now_x+len()*T;
double nxt_y=now_y+len()*T;
double nxt_z=now_z+len()*T;
double tmp1=calc(now_x,now_y,now_z);
double tmp2=calc(nxt_x,nxt_y,nxt_z);
if(tmp1>tmp2||exp((tmp1-tmp2)/T)*RAND_MAX>rand())
now_x=nxt_x,now_y=nxt_y,now_z=nxt_z;
T*=del_T;
}
} int main() {
while(~scanf("%d",&n)) {
if(!n)break;ans=1e18;
ansx=0,ansy=0,ansz=0;
for(int i=1;i<=n;i++) {
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
ansx+=p[i].x,ansy+=p[i].y,ansz+=p[i].z;
}ansx/=n,ansy/=n,ansz/=n;
Anneal();printf("%.5lf\n",ans);
}
return 0;
}

POJ数据好强啊!!!根本A不掉啊!

POJ2069:Super Star的更多相关文章

  1. POJ 2069 Super Star(计算几何の最小球包含+模拟退火)

    Description During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found stra ...

  2. 面向对象_04【关键字:super使用】

    super关键字:解决当子类重写父类对象方法后,子类对象无法访问父类的成员1,调用父类成员变量和方法 super.成员变量 super.成员方法([参数1,参数2.......])Example: / ...

  3. Super Star(最小球覆盖)

    Super Star http://poj.org/problem?id=2069 Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  4. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 推荐使用的派生方法:super().__init__()

    """ 推荐使用的派生方法:super().__init__() --super()的属性查找顺序是从当前位置开始找,根据mro列表,当前没有就往上找. super() ...

  6. Java继承:super关键字、构造器、final用法

    一.继承 继承好处 1.提高代码的重用性 2.提高代码的扩展性和维护性 3.为多态打下了基础 继承类型 继承子类创建对象的过程 二.super关键字的使用 理解:super代表父类的引用,用于访问父类 ...

  7. java 面向对象(十四):面向对象的特征二:继承性 (三) 关键字:super以及子类对象实例化全过程

    关键字:super 1.super 关键字可以理解为:父类的2.可以用来调用的结构:属性.方法.构造器3.super调用属性.方法:3.1 我们可以在子类的方法或构造器中.通过使用"supe ...

  8. 22-关键字:super

    1.super 关键字可以理解为:父类的 2.可以用来调用的结构: 属性.方法.构造器 3.super调用属性.方法: 3.1 我们可以在子类的方法或构造器中.通过使用"super.属性&q ...

  9. 【模拟退火】poj2069 Super Star

    题意:让你求空间内n个点的最小覆盖球. 模拟退火随机走的时候主要有这几种走法:①随机旋转角度. ②直接不随机,往最远的点的方向走,仅仅在尝试接受解的时候用概率.(最小圆/球覆盖时常用) ③往所有点的方 ...

随机推荐

  1. RedisTemplate访问Redis数据结构(介绍和常用命令)

    Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...

  2. 获取exe文件窗口抓图,将memo转化为JPG输出

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  3. require.js vs browserify

    require.js vs browserify require.js是模块加载器:browserify是预编译工具 require.js遵循的是AMD规范:browserify遵循的是CommonJ ...

  4. (转)Javascript模块化编程(二):AMD规范

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

  5. surf算法解析

    surf构造的金字塔图像与sift有很大的不同,sift采用的是DOG图像,surf采用的是hessian矩阵行列式近似值图像,hessian矩阵是surf算法的核心,构建hessian矩阵的目的是为 ...

  6. Spark0.9.0机器学习包MLlib-Optimization代码阅读

           基于Spark的一个生态产品--MLlib,实现了经典的机器学算法,源码分8个文件夹,classification文件夹下面包含NB.LR.SVM的实现,clustering文件夹下面包 ...

  7. Python赋值原理:Python无变量,万物皆对象

    有几个和以前的常见语言,比如c语言不同 改变变量数据不覆盖原来的 name = '苍老师' print(id(name)) name = '志玲' print(id(name)) 运行结果 73955 ...

  8. 小程序连接百度ai

    function getTextFromImage(res) { var access_token = '24.c649256d2e*****0.282335-11449805'; var url = ...

  9. 图片oom问题

    1.什么是OOM? 程序申请内存过大,虚拟机无法满足我们,然后自杀了.这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候.通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认 ...

  10. java项目常用架构

    三层架构 : 界面层/表现层 UI 业务逻辑层 BLL 针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理. 数据访问层 DAL 访问数据库 mvc : 而 MVC 是在三层架构的基 ...