poj1379
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的更多相关文章
- 【模拟退火】poj1379 Run Away
题意:平面上找一个点,使得其到给定的n个点的距离的最小值最大. 模拟退火看这篇:http://www.cnblogs.com/autsky-jadek/p/7524208.html 这题稍有不同之处仅 ...
- poj1379 模拟退火
题意:和上题一样...就是把最小值换成了最大值.. ref:http://www.cppblog.com/RyanWang/archive/2010/01/21/106112.html #includ ...
- 模拟退火算法(run away poj1379)
http://poj.org/problem?id=1379 Run Away Time Limit: 3000MS Memory Limit: 65536K Total Submissions: ...
- poj1379 Run Away
传送门:http://poj.org/problem?id=1379 [题解] 题目大意:求(0,0)->(X,Y)内的一个点,使得这个点到给定的n个点的最小距离最大. 模拟退火 一开始可以先把 ...
- poj-1379 Run Away(模拟退火算法)
题目链接: Run Away Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7982 Accepted: 2391 De ...
- POJ1379:Run Away
我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...
- poj-2420 A Star not a Tree?(模拟退火算法)
题目链接: A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5219 Accepte ...
- poj 2420 模拟退火法基础
/* 题意:给n个电脑,求一个点到这n个电脑的距离和最小. 模拟退火法:和poj1379的方法类似 因为坐标范围是0-10000 不妨把它看成是10000*10000的正方形来做 */ #includ ...
随机推荐
- Elasticsearch搜索之explain评分分析
Lucene的IndexSearcher提供一个explain方法,能够解释Document的Score是怎么得来的,具体每一部分的得分都可以详细地打印出来.这里用一个中文实例来纯手工验算一遍Luce ...
- iOS获取设备型号和App版本号等信息(OC+Swift)
iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...
- HR最喜欢问的问题_"你的职业规划是什么?"
很多面试官都会问,“你的职业规划是什么?”这个问题往往会难倒很多求职者.今天我跟大家分享,求职者怎样回答,才能更给自己加分 1.对目前自己要从事的这个岗位有清晰的认识,比如这个主要的工作是做什么的,大 ...
- html常用的知识点以及混合框架
html中: <hr/> 在页面中创建水平线 例如: <p> p标签是定义段落 > alt 作为可预备可替换信息,在无法加载图片时显示文字信息 定义htm ...
- win10用命令net启动服务没权限解决办法
法一.右击cmd命令图标,以管理员身份运行即可. 或者 法二.打开cmd命令的位置->右击属性->高级->勾上"以管理员身份运行"->确定.
- cannot locate symbol "atof" referenced by错误分析
ndk从r8升级到r10后, 使用eclipse编译出来的so库报错了,加载库的时候报错cannot locate symbol "atof" referenced by 原因:A ...
- [ext4]08 磁盘布局 - CheckSums
从2012年开始,Ext4和jbd2的元数据中都开始加入checksums.特性标识是metadata_csum.Checksum算法是在super_block中指定: struct ext4_sup ...
- idea: 纯 http 上的双向通信
纯 http 上的双向通信 最近大概看了下 rxJava 的订阅者模式,然后突发奇想有没有可能用类似的思路实现纯 http 上的双向通信 A 是传统的 http 服务器 B 是普通的客户端,假设我们能 ...
- css小细节罗列
有空时候把一些常见可能不是每个人都知道的css小细节总结了下,共勉. 1.line-height 众多周知,line-height是行高的意思,我们时常会使用类似line-height:24px;这样 ...
- httpd配置ResponseHeader
今天遇到一个问题:我把项目编译后的静态文件发布到开发机上,开发机使用httpd启的静态文件服务,页面的访问是在特制的壳浏览器里面,我更新了代码后,发现页面被缓存了,找到壳的RD联调了一下,发现我的主页 ...