我对模拟退火的理解: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)\)

爬山算法代码如下:

  1. #include <cmath>
  2. #include <ctime>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. #define sqr(a) ((a)*(a))
  7. int n;
  8. double ansx,ansy,ansz,ans;
  9. struct point {
  10. double x,y,z;
  11. }p[35];
  12. double len() {
  13. double x=rand()%200000-100000;
  14. return x/100000;
  15. }
  16. double dis(double x1,double y1,double z1,double x2,double y2,double z2) {
  17. return sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
  18. }
  19. double calc(double x,double y,double z) {
  20. double tmp=0;
  21. for(int i=1;i<=n;i++)
  22. tmp=max(tmp,dis(x,y,z,p[i].x,p[i].y,p[i].z));//改成取max
  23. if(tmp<ans)ans=tmp;
  24. return tmp;
  25. }
  26. int main() {
  27. srand(time(0));
  28. while(~scanf("%d",&n)) {
  29. if(!n)break;ans=1e18;
  30. ansx=0,ansy=0,ansz=0;
  31. for(int i=1;i<=n;i++) {
  32. scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
  33. ansx+=p[i].x,ansy+=p[i].y,ansz+=p[i].z;
  34. }ansx/=n,ansy/=n,ansz/=n;
  35. double now_x=ansx,now_y=ansy,now_z=ansz;
  36. for(double T=1e7;T>=1e-7;T*=0.998) {
  37. double nxt_x=now_x+len()*T;
  38. double nxt_y=now_y+len()*T;
  39. double nxt_z=now_z+len()*T;
  40. if(calc(nxt_x,nxt_y,nxt_z)<calc(now_x,now_y,now_z))
  41. now_x=nxt_x,now_y=nxt_y,now_z=nxt_z;
  42. }printf("%.5lf\n",ans);
  43. }
  44. return 0;
  45. }

模拟退火代码如下:

  1. #include <cmath>
  2. #include <ctime>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. #define sqr(a) ((a)*(a))
  7. const double T_0=1e-7;
  8. const double del_T=0.998;
  9. int n;
  10. double ansx,ansy,ansz,ans;
  11. struct point {
  12. double x,y,z;
  13. }p[35];
  14. double len() {
  15. double x=rand()%200000-100000;
  16. return x/100000;
  17. }
  18. double dis(double x1,double y1,double z1,double x2,double y2,double z2) {
  19. return sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
  20. }
  21. double calc(double x,double y,double z) {
  22. double tmp=0;
  23. for(int i=1;i<=n;i++)
  24. tmp=max(tmp,dis(x,y,z,p[i].x,p[i].y,p[i].z));
  25. if(tmp<ans)ans=tmp;
  26. return tmp;
  27. }
  28. void Anneal() {
  29. double T=1e7,now_x=ansx,now_y=ansy,now_z=ansz;
  30. while(T>=T_0) {
  31. double nxt_x=now_x+len()*T;
  32. double nxt_y=now_y+len()*T;
  33. double nxt_z=now_z+len()*T;
  34. double tmp1=calc(now_x,now_y,now_z);
  35. double tmp2=calc(nxt_x,nxt_y,nxt_z);
  36. if(tmp1>tmp2||exp((tmp1-tmp2)/T)*RAND_MAX>rand())
  37. now_x=nxt_x,now_y=nxt_y,now_z=nxt_z;
  38. T*=del_T;
  39. }
  40. }
  41. int main() {
  42. while(~scanf("%d",&n)) {
  43. if(!n)break;ans=1e18;
  44. ansx=0,ansy=0,ansz=0;
  45. for(int i=1;i<=n;i++) {
  46. scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
  47. ansx+=p[i].x,ansy+=p[i].y,ansz+=p[i].z;
  48. }ansx/=n,ansy/=n,ansz/=n;
  49. Anneal();printf("%.5lf\n",ans);
  50. }
  51. return 0;
  52. }

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. POJ 2856 Y2K Accounting Bug【简单暴力】

    链接: http://poj.org/problem?id=2586 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#probl ...

  2. Redis持久化——AOF(二)

    核心知识点: 1.AOF:以独立日志的方式记录写命令,重启时再执行命令.与RDB不同的是解决数据持久化的实时性,可以记录所有写操作. 2.AOF工作流程:写入命令.文件同步.文件重写.文件加载. 3. ...

  3. 2django 视图与网址进阶

    一.在网页中做加减法 采用/add/?a=11&b=22这样get方法进行 django-admin.py startproject zqxt_views cd zqxt_views pyth ...

  4. Ubuntu 16.04更换源

    Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更新源(就是这些软件所在的服务器),一般直接百度Ubuntu更新源就能出来一大堆,这时候最好是找和自己 ...

  5. spring-boot4

    1.1.1. Starter pom 除了官方也有其他第三方提供的starter Websocket是服务端推数据到客户端.长连接. 1.1.1.Xml 配置文件 有些时候必须使用xml配置. 1.1 ...

  6. shell脚本默认变量值

    脚本参数相关: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该shell脚本的第一个参数 $ 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单 ...

  7. UIView的概念与使用

    什么是UIView UIView可以称之为控件/视图 屏幕上所有能看到的东西都是UIView 按钮(UIButton).文本(UILabel)都是控件 控件都有一些共同的属性 -- 尺寸 -- 位置 ...

  8. 如何阻止form表单中的button按钮提交

    <form action="#" method="post"> <input type="text" name=" ...

  9. Java 9 逆天的十大新特性

    在介绍java9之前,我们先来看看java成立到现在的所有版本. 1990年初,最初被命名为Oak: 1995年5月23日,Java语言诞生: 1996年1月,第一个JDK-JDK1.0诞生: 199 ...

  10. LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行

    延迟执行是指一个表达式的值延迟获取,知道它的值真正用到. 当你用foreach循环时,表达式才真正的执行. 延迟执行有个最重要的好处:它总是给你最新的数据 实现延迟运行 你可以使用yield关键字实现 ...