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. 卷积神经网络CNN与深度学习常用框架的介绍与使用

    一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...

  2. AspNet.OData 协议概述

    1. 什么是OData? OData 全称 Open Data Protocol,字面理解为开放数据协议,是一个基于Http协议且API实现为Restful风格的协议标准,目前由微软支持大力推广,你可 ...

  3. jsp实现仿QQ空间新建多个相册名称,向相册中添加照片

    工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删 ...

  4. webrtc学习笔记2(Android端demo代码结构)

    最近正在修改webrtc的Android端demo和服务器交互的内容,介绍一下demo的大体结构吧,以便能快速回忆. 环境:Android5.0以上.libjingle_peerconnection_ ...

  5. Javascript中call和apply

    在上一章http://www.cnblogs.com/meiyh/p/6207671.html 我有提到javascript很重要的this关键字,现在我们结合这个关键字使用的下面的两个关键字: ca ...

  6. WPF 杂谈——资源文件

    编写一个应用难免要用到WPF本身的控件.不管是WinForm还是网页都会有自己的控件.只是在写法和用法上有所不同而以.而控件命名却离不开那几个单词.所以不用担心判断不出来哪个是按扭,哪个是文本框.举个 ...

  7. JDK内置日志系统

    1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...

  8. String类理解

    1.首先应该知道的是:String是一个类,不属于基本类型,而是引用类型. 2.创建String对象的三种方式的比较: 第一种是先去String pool检查是否存在"abc"常量 ...

  9. percona-xtrabackup安装

    二进制包安装(推荐安装方式,不用安装依赖包,非常方便): 1.下载安二进制包:      wget https://www.percona.com/downloads/XtraBackup/Perco ...

  10. .NET面试题系列[16] - 多线程概念(1)

    .NET面试题系列目录 这篇文章主要是各个百科中的一些摘抄,简述了进程和线程的来源,为什么出现了进程和线程. 操作系统层面中进程和线程的实现 操作系统发展史 直到20世纪50年代中期,还没出现操作系统 ...