模拟退火绝对是从OI--ACM以来接触过的所有算法里面最黑科技的orz

题意:地上有一堆hole,要找一个点,使得(距离该点最远的hole的距离)最小。

sol:本来想套昨天的模拟退火模板,初值(0,0),向8个方向扩散。

然而这题并没有这么naive。

模板2.0 get:

  1. #define eps 1e-3
  2. #define pi acos(-1.0)
  3. #define POI 15 //独立跑POI次,找其中最小的 tp[1..POI]是随机的初值
  4. #define RUN 40 //迭代次数,本题中即点(tx,ty)向RUN个方向发散
  5.  
  6. void sa()
  7. {
  8. for(int i=;i<=POI;i++)
  9. {
  10. tp[i].x=(rand()%+)/1000.0*X;
  11. tp[i].y=(rand()%+)/1000.0*Y;
  12. sol[i]=dis(tp[i].x,tp[i].y);
  13. //printf("%.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
  14. }
  15.  
  16. double step=1.0*max(X,Y)/sqrt(1.0*N);
  17. while(step>eps)
  18. {
  19. for(int i=;i<=POI;i++)
  20. {
  21. double kx=tp[i].x,ky=tp[i].y;
  22. double tx=kx,ty=ky;
  23. for(int j=;j<RUN;j++)
  24. {
  25. double angle=(rand()%+)/1000.0**pi;
  26. kx=tx+cos(angle)*step;
  27. ky=ty+sin(angle)*step;
  28. if((kx>X)||(ky>Y)||(kx<)||(ky<)) continue;
  29. double tmp=dis(kx,ky);
  30. if(tmp<sol[i])
  31. {
  32. tp[i].x=kx; tp[i].y=ky;
  33. sol[i]=tmp;
  34. }
  35. }
  36. }
  37. step*=0.80;
  38. }
  39. }

AC Code:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<ctime>
  5. using namespace std;
  6.  
  7. #define eps 1e-3
  8. #define pi acos(-1.0)
  9. #define POI 15 //独立跑POI次,找其中最小的 tp[1..POI]是随机的初值
  10. #define RUN 40 //迭代次数,本题中即点(tx,ty)向RUN个方向发散
  11. int X,Y,N;
  12. double ans;
  13. int ansi;
  14. struct
  15. {
  16. double x,y;
  17. }tp[],hol[];
  18. double sol[];
  19.  
  20. double dist(double x1,double y1,double x2,double y2)
  21. {
  22. return(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
  23. }
  24.  
  25. double dis(double x,double y)
  26. {
  27. double tmp=0.000;
  28. for(int i=;i<=N;i++)
  29. {
  30. double tx=hol[i].x,ty=hol[i].y;
  31. tmp=max(tmp,dist(tx,ty,x,y));
  32. }
  33. return tmp;
  34. }
  35.  
  36. void sa()
  37. {
  38. for(int i=;i<=POI;i++)
  39. {
  40. tp[i].x=(rand()%+)/1000.0*X;
  41. tp[i].y=(rand()%+)/1000.0*Y;
  42. sol[i]=dis(tp[i].x,tp[i].y);
  43. //printf("%.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
  44. }
  45.  
  46. double step=1.0*max(X,Y)/sqrt(1.0*N);
  47. while(step>eps)
  48. {
  49. for(int i=;i<=POI;i++)
  50. {
  51. double kx=tp[i].x,ky=tp[i].y;
  52. double tx=kx,ty=ky;
  53. for(int j=;j<RUN;j++)
  54. {
  55. double angle=(rand()%+)/1000.0**pi;
  56. kx=tx+cos(angle)*step;
  57. ky=ty+sin(angle)*step;
  58. if((kx>X)||(ky>Y)||(kx<)||(ky<)) continue;
  59. double tmp=dis(kx,ky);
  60. if(tmp<sol[i])
  61. {
  62. tp[i].x=kx; tp[i].y=ky;
  63. sol[i]=tmp;
  64. }
  65. }
  66. }
  67. step*=0.80;
  68. }
  69. }
  70.  
  71. int main()
  72. {
  73. srand(time(NULL));
  74. while(cin>>X>>Y>>N)
  75. {
  76. for(int i=;i<=N;i++)
  77. cin>>hol[i].x>>hol[i].y;
  78.  
  79. sa();
  80.  
  81. ans=(X*X+Y*Y)*100.0;
  82. for(int i=;i<=POI;i++)
  83. {
  84. //printf("AA: %.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
  85. if(sol[i]<ans)
  86. {
  87. ans=sol[i];
  88. ansi=i;
  89. }
  90. }
  91. printf("(%.1f,%.1f).\n",tp[ansi].x,tp[ansi].y);
  92. printf("%.1lf\n",ans);
  93. }
  94. return ;
  95. }

ref:

http://blog.csdn.net/acm_cxlove/article/details/7954321

http://blog.csdn.net/zxy_snow/article/details/6682926

http://www.kuangbin.net/archives/hdu3932#more-435

hdu3932 模拟退火的更多相关文章

  1. ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]

    Minimal Circle Time Limit: 5 Seconds      Memory Limit: 32768 KB You are to write a program to find ...

  2. HDU 3932 模拟退火

    HDU3932 题目大意:给定一堆点,找到一个点的位置使这个点到所有点中的最大距离最小 简单的模拟退火即可 #include <iostream> #include <cstdio& ...

  3. D.Country Meow 最小球覆盖 三分套三分套三分 && 模拟退火

    // 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值.   思路 非常裸的最小 ...

  4. bzoj3680模拟退火

    看题意就是一道数学物理题,带权费马点   --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...

  5. 无题的题 & 模拟退火...

    题意: 给你不超过8条一端在圆心的半径,求他们组成的凸包的最大面积. SOL: 正解怎么搞啊不会啊...然后昨天毛爷爷刚讲过模拟退火...那么就打一个吧... 然后就T了,不过三角形的部分分妥妥的.. ...

  6. [POJ2069]Super Star(模拟退火)

    题目链接:http://poj.org/problem?id=2069 题意:求一个半径最小的球,使得它可以包围住所有点. 模拟退火,圆心每次都去找最远那个点,这样两点之间的距离就是半径,那么接下来移 ...

  7. [POJ2420]A Star not a Tree?(模拟退火)

    题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...

  8. 模拟退火算法求解旅行商问题(附c和matlab源代码)

    前几天在做孔群加工问题,各种假设到最后就是求解旅行商问题了,因为原本就有matlab代码模板所以当时就改了城市坐标直接用了,发现运行速度惨不忍睹,最后用上了两个队友的电脑一起跑.这次模拟结束后在想用c ...

  9. POJ 2420 A Star not a Tree?(模拟退火)

    题目链接 居然1Y了,以前写的模拟退火很靠谱啊. #include <cstdio> #include <cstring> #include <string> #i ...

随机推荐

  1. [转]Gson过滤字段

    原文地址:http://my.oschina.net/orgsky/blog/368768 摘要 Gson过滤字段 Gson过滤字段 Gson 过滤 字段 属性 目录[-] 最简单的用法 方法1:排除 ...

  2. 用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮

    需求 有这么一个需求,一个form有多个文件要上传,但又不是传统的图片批量上传那种,是类似下图这种需求,一开始是用的swfupload做的上传,但是问题是如果有多个按钮的话,就要写很多重复的代码,于为 ...

  3. 用js转换joson返回数据库的时间格式为/Date(*************)/

    原理是取中间的毫秒数,再转换成js的Date类型 function ChangeDateFormat(val) { if (val != null) { var date = new Date(par ...

  4. 解决问题:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    WindowServer2012服务器,添加角色安装完.netframework和iis之后,运行aspx页面就报如下错误: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法 ...

  5. nios II--实验4——按键中断软件部分

    软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...

  6. 代码设计工具——PowerDesigner

    详情请参考博客: http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html

  7. 拼图游戏(js,C#,java三种语言)

    <html> <head> <meta charset="utf-8"> <style type="text/css" ...

  8. 如何设置unobtrusive的语言包

    场景:网站是用的validate.unotrusive.js验证的,网站的语言已经切换到繁体了,但是提示语言还是英文. 环境:asp.net mvc4,jquery.validate.unotrusi ...

  9. VS2013 无法在Web服务器上启动调试。IIS未列出与打开的URL匹配的网站。

    出现这个问题的原因是:没有用管理员权限运行VS2013. 本来遇到这个问题的时候,不知道什么原因.后来附加到进程调试的时候,提示要以管理员身份运行.才知道啥原因.

  10. LINUX 配置IP

    1. 用命令查看一下IP配置:ifconfig, 修改网络配置文件  vi  /etc/sysconfig/network-scripts/ifcfg-eht0 2.但是,很多时候,较难记住里面文件的 ...