poj1379

题意

给出 n 个洞的坐标,要求找到一点使得这一点距离最近洞的距离最远。

分析

通过这道题学习一下模拟退火算法

这种随机化的算法,在求解距离且精度要求较小时很有用。

简而言之,由随机选取的多个初始点,进行多次的随机变换,并根据是否更优而选择是否保留答案,

那么首先要选择两个值,delta 表示初始最大变换的半径(即对应初始的火温),d 控制半径缩小的快慢(火温减小的快慢)。

这道题,比较直白,随机变换就是改变坐标的位置(通过半径和角度就可以变换坐标,当然角度也是随机的),若变换后距所有点的距离增大了那么则更优。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
const int MAXN = 1005;
const int MAXP = 20; // 随机选取 20 个点
const double PI = acos(-1.0);
double X, Y;
int n;
double dis[100];
struct P
{
double x, y;
P() {}
P(double _x, double _y) : x(_x), y(_y) {}
P operator - (P p)
{
return P(x - p.x, y - p.y);
}
double dis()
{
return sqrt(x * x + y * y);
}
}a[MAXN], ans[MAXN];
double getMinDis(P p)
{
double as = 1e9;
for(int i = 0; i < n; i++)
{
as = min(as, (p - a[i]).dis());
}
return as;
}
P SA()
{
for(int i = 0; i < MAXP; i++)
{
ans[i].x = (rand() % 1000 + 1) / 1000.0 * X;
ans[i].y = (rand() % 1000 + 1) / 1000.0 * Y;
dis[i] = getMinDis(ans[i]);
}
double delta = max(X, Y) / sqrt(n * 1.0), d = 0.9;
while(delta > 0.01) // 边界最小值
{
for(int i = 0; i < MAXP; i++)
{
for(int j = 0; j < 20; j++)
{
P t = ans[i];
double angle = rand() % 1000 / 1000.0 * 2 * PI;
t.x += delta * cos(angle) * (rand() % 1000 / 1000.0);
t.y += delta * sin(angle) * (rand() % 1000 / 1000.0);
if(t.x < 0 || t.x > X || t.y < 0 || t.y > Y) continue;
double tmp = getMinDis(t);
if(tmp > dis[i])
{
dis[i] = tmp;
ans[i] = t;
}
}
}
delta *= d;
}
double dd = 0;
int pp = 0;
for(int i = 0; i < MAXP; i++)
{
if(dis[i] > dd)
{
dd = dis[i];
pp = i;
}
}
return ans[pp];
}
int main()
{
srand(time(0));
int T;
for(scanf("%d", &T); T--;)
{
scanf("%lf%lf%d", &X, &Y, &n);
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &a[i].x, &a[i].y);
}
P p = SA();
printf("The safest point is (%.1f, %.1f).\n", p.x, p.y);
}
return 0;
}

poj1379的更多相关文章

  1. 【模拟退火】poj1379 Run Away

    题意:平面上找一个点,使得其到给定的n个点的距离的最小值最大. 模拟退火看这篇:http://www.cnblogs.com/autsky-jadek/p/7524208.html 这题稍有不同之处仅 ...

  2. poj1379 模拟退火

    题意:和上题一样...就是把最小值换成了最大值.. ref:http://www.cppblog.com/RyanWang/archive/2010/01/21/106112.html #includ ...

  3. 模拟退火算法(run away poj1379)

    http://poj.org/problem?id=1379 Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: ...

  4. poj1379 Run Away

    传送门:http://poj.org/problem?id=1379 [题解] 题目大意:求(0,0)->(X,Y)内的一个点,使得这个点到给定的n个点的最小距离最大. 模拟退火 一开始可以先把 ...

  5. poj-1379 Run Away(模拟退火算法)

    题目链接: Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7982   Accepted: 2391 De ...

  6. POJ1379:Run Away

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...

  7. poj-2420 A Star not a Tree?(模拟退火算法)

    题目链接: A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5219   Accepte ...

  8. poj 2420 模拟退火法基础

    /* 题意:给n个电脑,求一个点到这n个电脑的距离和最小. 模拟退火法:和poj1379的方法类似 因为坐标范围是0-10000 不妨把它看成是10000*10000的正方形来做 */ #includ ...

随机推荐

  1. Go - 第一个 go 程序 -- helloworld

    创建程序目录 接着上一节的内容,在我们的workspace (D:\Gopher) 里面创建子目录 hello,他的绝对路径为:D:\Gopher\src\github.com\tuo\hello 创 ...

  2. js里变量的作用域

    一.在js中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域.也就是说,如果变量是在某个函数中定义的,那么,它在函数以外的地方是不可见的.但是,如果该变量是定义在if或者for这样的代码块 ...

  3. SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

    本位出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见 ...

  4. 【WPF】学习笔记(二)——依旧是一个电子签名板

    这篇博客呢,主要谈谈在实现电子签名功能中踩过的几个坑:1.System.BadImageFormatException异常:2.无法加载DLL“###.dll”,: 找不到指定的模块. (异常来自 H ...

  5. webapp万能选择器:iosselect

    iosselect是个什么东西? 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的picker,安卓下各浏览器展示各异,我们需要一个选择器组件来统一各端下各种浏览器的展示.下面是 ...

  6. SectionIndexer 利用系统的控件,制作比较美观的侧栏索引控件

    如上图所示,右侧的索引是系统提供的,具体使用方法,请搜索: SectionIndexer 相关的资料进行开发.

  7. 为什么要用Handler ?

    我的理解,Handler的好处之一就是配合子线程处理数据之后控制UI的显示. 如下是http://www.cnblogs.com/sydeveloper/p/3312865.html的完美解释: 当应 ...

  8. 一个栗子上手CSS3动画

    最近杂七杂八的事情很多,很多知识都没来得及总结,是时候总结总结,开启新的篇章- 本篇文章不一一列举CSS3动画的属性,若需要了解API,可前往MDN 在开始栗子前,我们先补补基础知识. css3动画分 ...

  9. C返回函数指针的函数

    如下函数 char (*retCharWithInt(char, char))(int); 申明了函数指针retCharWithInt,该指针指向一个形参是(char,char),返回值是char(* ...

  10. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...