/*
模拟退火法:
找到一些随机点,从这些点出发,随机的方向坐标向外搜索;
最后找到这些随机点的最大值;
坑://if(xx>-eps&&xx<x+eps&&yy>-eps&&yy<eps+y) {不知道为什么这个判断方式错误??????
*/
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#define pi acos(-1.0)
#define N 1100
#define inf 1000000000000
#define eps 1e-8
using namespace std;
double x,y;
int n;
struct node {
double u,v,dis;
}f[N],endd,ff[N];
double diss(double x,double y,int i) {
return sqrt((x-f[i].u)*(x-f[i].u)+(y-f[i].v)*(y-f[i].v));
}
double Mindis(double x,double y) {
double minn=1.0*inf,ss;
int i;
for(i=1;i<=n;i++) {
ss=diss(x,y,i);
if(minn>ss)
minn=ss;
}
return minn;
}
void compute() {
int i,j;
double xx,yy;
for(i=1;i<=20;i++) {//先随机出来一些点
ff[i].u=(rand()%1000+1)/1000.0*x;
ff[i].v=(rand()%1000+1)/1000.0*y;
ff[i].dis=Mindis(ff[i].u,ff[i].v);
}
double T=sqrt(1.0*x*x+1.0*y*y);
double rate=0.9;
while(T>eps) {
for(i=1;i<=20;i++)//对于这些点分别向外搜
for(j=1;j<=30;j++) {//随机30个半径来搜索,更新,得到每个点可以到达的最远距离
double ran=(rand()%1000+1)/1000.0*pi*10;
xx=ff[i].u+cos(ran)*T;
yy=ff[i].v+sin(ran)*T;
//if(xx>-eps&&xx<x+eps&&yy>-eps&&yy<eps+y) {不知道为什么这个判断方式错误??????
if(xx<0.0||xx>x||yy<0.0||yy>y)continue;
double di=Mindis(xx,yy);
if(ff[i].dis<di) {
ff[i].dis=di;
ff[i].u=xx;
ff[i].v=yy;
}
}
T*=rate;//退火率
}
for(i=1;i<=20;i++)//找到最大的一个
if(endd.dis<ff[i].dis)
endd=ff[i];
return ;
}
int main() {
// printf("%d\n",(rand()%1000+1)/1000.0*2*pi);
int m,i,j,k,t;
scanf("%d",&t);
while(t--) {
scanf("%lf%lf%d",&x,&y,&n);
for(i=1;i<=n;i++)
scanf("%lf%lf",&f[i].u,&f[i].v);
endd.dis=-1;
compute();
printf("The safest point is (%.1f, %.1f).\n",endd.u,endd.v);
}
return 0;
}

poj 1379 模拟退火法的更多相关文章

  1. POJ 1016 模拟字符串

    Numbers That Count Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20396   Accepted: 68 ...

  2. unity, 模拟退后台

    //simulateSwitchToBackground.cs using UnityEngine;using System.Collections;using System.Collections. ...

  3. POJ 1208 模拟

    2017-08-28 15:07:16 writer:pprp 好开心,这道题本来在集训的时候做了很长很长时间,但是还是没有做出来,但是这次的话,只花了两个小时就做出来了 好开心,这次采用的是仔细分析 ...

  4. POJ - 3087 模拟 [kuangbin带你飞]专题一

    模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...

  5. POJ.1379.Run Away(模拟退火)

    题目链接 POJ输出不能用%lf! mmp从4:30改到6:00,把4:30交的一改输出也过了. 于是就有了两份代码.. //392K 500MS //用两点构成的矩形更新,就不需要管边界了 #inc ...

  6. POJ 1379 模拟退火

    模拟退火算法,很久之前就写过一篇文章了.双倍经验题(POJ 2420) 题意: 在一个矩形区域内,求一个点的距离到所有点的距离最短的那个,最大. 这个题意,很像二分定义,但是毫无思路,也不能暴力枚举, ...

  7. Shuffle'm Up POJ - 3087(模拟)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15249   Accepted: 6962 Des ...

  8. POJ 1471 模拟?

    题意:求最大无坏点三角形 思路: 模拟? (为什么我模拟过了...) 有人用 DP,有人用 搜索... // by SiriusRen #include <cstdio> #include ...

  9. POJ 1951 模拟

    思路: 坑爹模拟毁我一生 给两组数据: 输入: YOURE TRAVELING THROUGH ANOTHER DIMENSION A DIMENSION NOT OF SIGHT. 输出: YR T ...

随机推荐

  1. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机【并查集+二分】

    二分答案,把边权小于mid的边的两端点都并起来,看最后是否只剩一个联通块 #include<iostream> #include<cstdio> using namespace ...

  2. python/shell脚本报异常^M: bad interpreter: No such file or directory

    问题:在Windows写了一python脚本,上传Linux服务器执行,报异常*****^M: bad interpreter: No such file or directory 原因:window ...

  3. 键盘按钮keyCode大全:获取按键对应的键值的方法

    没有大全,只有方法,授人与鱼不如授人于渔: 下面这行代码,大家可以打在控制台里,直接进行测试: document.body.onkeyup = function (e) { e = e || wind ...

  4. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  5. pyinstaller遇到的坑

    最近接了一个python的活,具体的就不展开,大概就是需要搭建一个服务器,接收客户端上传文件,调用算法模型,然后返回相应的数据.算法模块用的是tensorflow模块,里面一大堆东西,网上看了很多,最 ...

  6. 上传txt文件编码格式判断(文本乱码解决方法)

    说明 通过ajax或者浏览上传文本文件,上传时候c#处理时候因为文本格式的创建不同,在获取内容时候会出现中文乱码. 解决方法 通过上传的文件流,判断文件的编码格式,在使用对应的编码格式获取文本内容 # ...

  7. EasyUI系列学习(十一)-Accordion(分类)

    一.加载 1.class加载 <div class="easyui-accordion" style="width:300px;height:200px" ...

  8. P1334 瑞瑞的木板

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  9. Elasticsearch--扩展索引结构

    目录 索引树形数据 索引非扁平数据 索引关系型数据 使用嵌套对象 评分与嵌套查询 使用主从关系 索引树形数据 使用path_analyzer分析树形数据字段 索引非扁平数据 数据如下: { " ...

  10. C++学习笔记(一)之指针

    指向指针的引用 ; int * p; int *&r = p; //r为对指针p的引用 r = &i; //r为对p的引用,故对r赋值即将p指向i *r = ; //更新i的值 通过* ...