hdu3932 模拟退火
模拟退火绝对是从OI--ACM以来接触过的所有算法里面最黑科技的orz
题意:地上有一堆hole,要找一个点,使得(距离该点最远的hole的距离)最小。
sol:本来想套昨天的模拟退火模板,初值(0,0),向8个方向扩散。
然而这题并没有这么naive。
模板2.0 get:
- #define eps 1e-3
- #define pi acos(-1.0)
- #define POI 15 //独立跑POI次,找其中最小的 tp[1..POI]是随机的初值
- #define RUN 40 //迭代次数,本题中即点(tx,ty)向RUN个方向发散
- void sa()
- {
- for(int i=;i<=POI;i++)
- {
- tp[i].x=(rand()%+)/1000.0*X;
- tp[i].y=(rand()%+)/1000.0*Y;
- sol[i]=dis(tp[i].x,tp[i].y);
- //printf("%.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
- }
- double step=1.0*max(X,Y)/sqrt(1.0*N);
- while(step>eps)
- {
- for(int i=;i<=POI;i++)
- {
- double kx=tp[i].x,ky=tp[i].y;
- double tx=kx,ty=ky;
- for(int j=;j<RUN;j++)
- {
- double angle=(rand()%+)/1000.0**pi;
- kx=tx+cos(angle)*step;
- ky=ty+sin(angle)*step;
- if((kx>X)||(ky>Y)||(kx<)||(ky<)) continue;
- double tmp=dis(kx,ky);
- if(tmp<sol[i])
- {
- tp[i].x=kx; tp[i].y=ky;
- sol[i]=tmp;
- }
- }
- }
- step*=0.80;
- }
- }
AC Code:
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<ctime>
- using namespace std;
- #define eps 1e-3
- #define pi acos(-1.0)
- #define POI 15 //独立跑POI次,找其中最小的 tp[1..POI]是随机的初值
- #define RUN 40 //迭代次数,本题中即点(tx,ty)向RUN个方向发散
- int X,Y,N;
- double ans;
- int ansi;
- struct
- {
- double x,y;
- }tp[],hol[];
- double sol[];
- double dist(double x1,double y1,double x2,double y2)
- {
- return(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
- }
- double dis(double x,double y)
- {
- double tmp=0.000;
- for(int i=;i<=N;i++)
- {
- double tx=hol[i].x,ty=hol[i].y;
- tmp=max(tmp,dist(tx,ty,x,y));
- }
- return tmp;
- }
- void sa()
- {
- for(int i=;i<=POI;i++)
- {
- tp[i].x=(rand()%+)/1000.0*X;
- tp[i].y=(rand()%+)/1000.0*Y;
- sol[i]=dis(tp[i].x,tp[i].y);
- //printf("%.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
- }
- double step=1.0*max(X,Y)/sqrt(1.0*N);
- while(step>eps)
- {
- for(int i=;i<=POI;i++)
- {
- double kx=tp[i].x,ky=tp[i].y;
- double tx=kx,ty=ky;
- for(int j=;j<RUN;j++)
- {
- double angle=(rand()%+)/1000.0**pi;
- kx=tx+cos(angle)*step;
- ky=ty+sin(angle)*step;
- if((kx>X)||(ky>Y)||(kx<)||(ky<)) continue;
- double tmp=dis(kx,ky);
- if(tmp<sol[i])
- {
- tp[i].x=kx; tp[i].y=ky;
- sol[i]=tmp;
- }
- }
- }
- step*=0.80;
- }
- }
- int main()
- {
- srand(time(NULL));
- while(cin>>X>>Y>>N)
- {
- for(int i=;i<=N;i++)
- cin>>hol[i].x>>hol[i].y;
- sa();
- ans=(X*X+Y*Y)*100.0;
- for(int i=;i<=POI;i++)
- {
- //printf("AA: %.1f~%.1f=%.1f\n",tp[i].x,tp[i].y,sol[i]);
- if(sol[i]<ans)
- {
- ans=sol[i];
- ansi=i;
- }
- }
- printf("(%.1f,%.1f).\n",tp[ansi].x,tp[ansi].y);
- printf("%.1lf\n",ans);
- }
- return ;
- }
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 模拟退火的更多相关文章
- ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]
Minimal Circle Time Limit: 5 Seconds Memory Limit: 32768 KB You are to write a program to find ...
- HDU 3932 模拟退火
HDU3932 题目大意:给定一堆点,找到一个点的位置使这个点到所有点中的最大距离最小 简单的模拟退火即可 #include <iostream> #include <cstdio& ...
- D.Country Meow 最小球覆盖 三分套三分套三分 && 模拟退火
// 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值. 思路 非常裸的最小 ...
- bzoj3680模拟退火
看题意就是一道数学物理题,带权费马点 --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...
- 无题的题 & 模拟退火...
题意: 给你不超过8条一端在圆心的半径,求他们组成的凸包的最大面积. SOL: 正解怎么搞啊不会啊...然后昨天毛爷爷刚讲过模拟退火...那么就打一个吧... 然后就T了,不过三角形的部分分妥妥的.. ...
- [POJ2069]Super Star(模拟退火)
题目链接:http://poj.org/problem?id=2069 题意:求一个半径最小的球,使得它可以包围住所有点. 模拟退火,圆心每次都去找最远那个点,这样两点之间的距离就是半径,那么接下来移 ...
- [POJ2420]A Star not a Tree?(模拟退火)
题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...
- 模拟退火算法求解旅行商问题(附c和matlab源代码)
前几天在做孔群加工问题,各种假设到最后就是求解旅行商问题了,因为原本就有matlab代码模板所以当时就改了城市坐标直接用了,发现运行速度惨不忍睹,最后用上了两个队友的电脑一起跑.这次模拟结束后在想用c ...
- POJ 2420 A Star not a Tree?(模拟退火)
题目链接 居然1Y了,以前写的模拟退火很靠谱啊. #include <cstdio> #include <cstring> #include <string> #i ...
随机推荐
- [转]Gson过滤字段
原文地址:http://my.oschina.net/orgsky/blog/368768 摘要 Gson过滤字段 Gson过滤字段 Gson 过滤 字段 属性 目录[-] 最简单的用法 方法1:排除 ...
- 用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮
需求 有这么一个需求,一个form有多个文件要上传,但又不是传统的图片批量上传那种,是类似下图这种需求,一开始是用的swfupload做的上传,但是问题是如果有多个按钮的话,就要写很多重复的代码,于为 ...
- 用js转换joson返回数据库的时间格式为/Date(*************)/
原理是取中间的毫秒数,再转换成js的Date类型 function ChangeDateFormat(val) { if (val != null) { var date = new Date(par ...
- 解决问题:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
WindowServer2012服务器,添加角色安装完.netframework和iis之后,运行aspx页面就报如下错误: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法 ...
- nios II--实验4——按键中断软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- 代码设计工具——PowerDesigner
详情请参考博客: http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html
- 拼图游戏(js,C#,java三种语言)
<html> <head> <meta charset="utf-8"> <style type="text/css" ...
- 如何设置unobtrusive的语言包
场景:网站是用的validate.unotrusive.js验证的,网站的语言已经切换到繁体了,但是提示语言还是英文. 环境:asp.net mvc4,jquery.validate.unotrusi ...
- VS2013 无法在Web服务器上启动调试。IIS未列出与打开的URL匹配的网站。
出现这个问题的原因是:没有用管理员权限运行VS2013. 本来遇到这个问题的时候,不知道什么原因.后来附加到进程调试的时候,提示要以管理员身份运行.才知道啥原因.
- LINUX 配置IP
1. 用命令查看一下IP配置:ifconfig, 修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eht0 2.但是,很多时候,较难记住里面文件的 ...