我对模拟退火的理解: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. 【HTML5开发系列】meta元素详解

    meta元素可以用来定义文档的各种元数据.他有很多种用法,一个HTML文档可以包含多个meta元素. meta元素在HTML5中的变化 charset属性是HTML5中新增的.在HTML4中,http ...

  2. Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战

    目录 写在前面 亿级流量IM的应用场景 十万级 单体IM 系统 高并发分布式IM系统架构 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -10[ 博客园 总入口 ] 写在前面 ​ 大家好 ...

  3. On the importance of initialization and momentum in deep learning

    Ilya Sutskever1 ilyasu@google.com James Martens jmartens@cs.toronto.edu George Dahl gdahl@cs.toronto ...

  4. Android系统移植与调试之------->如何修改Android自带的apk出现一圈圈类似鸡蛋的花纹

    最近被一个问题烦恼到了,就是android4.1系统自带的Email.文件管理器.信息等apk都出现同一个问题,就是现实在平板上的时候会出现一圈圈类似鸡蛋的花纹. 我想了两种方法来解决,第一种方法没有 ...

  5. 保护眼睛,win7家庭版如何修改窗口的背景颜色

    win7的窗口背景色为白色,长时间使用电脑对眼睛的刺激比较大,为了保护眼睛建议改成浅灰色或者淡绿.淡黄色等,可是win7的家庭版里没有[个性化]菜单,那么我们如何修改呢? 首先在[开始]处找到[控制面 ...

  6. LeetCode:最长回文子串【5】

    LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...

  7. android客户端登录&注册的实现

    MainActivity多线程的实现: package com.example.loginconnect; import java.lang.ref.WeakReference; import jav ...

  8. 每天一个Linux命令(32)date命令

          date命令是显示或设置系统时间与日期.        (1)用法:       用法:  date [选项]  [参数]       (2)功能:       功能:  根据指定格式显示 ...

  9. 算法(Algorithms)第4版 练习 1.3.2

    was best times of the was the it (1 left on stack)

  10. 深入理解JVM - 晚期(运行期)优化

    在部分商用虚拟机中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code) ...