POJ - 2069 Super Star HDU - 3007 Buried memory
模拟退火求最小球覆盖和最小圆覆盖
原本在我的认识中,模拟退火一定要有一个随机化在里面。
但是有些模拟退火,你可以清楚地意识到答案是可以向某个方向逼近的,这个时候就不用随机了。
比如像第一道题POJ 2069,这道题求的就是最小球覆盖。
对于任意的初始点,我们都能算出以当前点作为圆心的覆盖半径是多少。
显然,决定这条半径多长的,是所有点中离圆心最远的。
那么我们是不是可以越来越靠近这个最远的点,使得最远的距离最小,也就是球的半径能最小?
答案是肯定的,我们直接慢慢地更新答案即可。
同时我们也套上模拟退火的板子,用一个T来表示那一步移动的步长。
最小圆覆盖当然比三维情况要简单,所以能理解上面的,那道题也就顺便切掉了。
分别附上这两道题的代码:
POJ 2069
#include<cstdio>
#include<cmath>
const int maxn = 35;
const double delta = 0.98;
struct Point
{double x, y, z;
} s[maxn];
double ansx, ansy, ansz, ans;
int n;inline double sq(double x)
{return x * x;
}
double dist(double x, double y, double z, double xx, double yy, double zz)
{return sqrt(sq(x - xx) + sq(y - yy) + sq(z - zz));
}int main()
{while(scanf("%d", &n) == 1 && n){ansx = ansy = ansz = 0;// 取平均值过不了是最骚的for(int i = 1; i <= n; i++){scanf("%lf%lf%lf", &s[i].x, &s[i].y, &s[i].z);}for(double T = 100; T > 1e-15; T = T * delta)// 话说这道题卡精度{double maxdist = -1e15; int idx = -1;for(int i = 1; i <= n; i++){double temp = dist(ansx, ansy, ansz, s[i].x, s[i].y, s[i].z);if(temp > maxdist){maxdist = temp; idx = i;}}ans = maxdist;ansx += (s[idx].x - ansx) / maxdist * T;ansy += (s[idx].y - ansy) / maxdist * T;ansz += (s[idx].z - ansz) / maxdist * T;}printf("%.5lf\n", ans);}return 0;
}
HDU 3007
#include<cstdio>
#include<cmath>
const int maxn = 505;
struct Nodes
{double x, y;
} s[maxn];
double ansx, ansy;
int n;
inline double sq(double x)
{return x * x;
}
double dist(double x, double y, double xx, double yy)
{return sqrt(sq(x - xx) + sq(y - yy));
}
int main()
{while(scanf("%d", &n) == 1 && n){ansx = ansy = 0;for(int i = 1; i <= n; i++){scanf("%lf%lf", &s[i].x, &s[i].y);ansx += s[i].x; ansy += s[i].y;}ansx /= n; ansy /= n;const double delta = 0.98;for(double T = 2018; T > 1e-10; T *= delta){double maxr = -1e10; int idx = -1;for(int i = 1; i <= n; i++){double temp = dist(ansx, ansy, s[i].x, s[i].y);if(temp > maxr){maxr = temp; idx = i;}}ansx += (s[idx].x - ansx) / maxr * T;ansy += (s[idx].y - ansy) / maxr * T;}printf("%.2lf %.2lf %.2lf\n", ansx, ansy, dist(ansx, ansy, s[1].x, s[1].y));}return 0;
}
转载于:https://www.cnblogs.com/Garen-Wang/p/9913287.html
POJ - 2069 Super Star HDU - 3007 Buried memory相关推荐
- poj 2069 Super Star 最小求覆盖【爬山算法】
题意:给定几个点,要求覆盖这些点的最小球半径.(求到n个点的最大距离最小化的点 因为是单峰的所以可以用爬山算法 主要是我的退火算法板子精度达不到? //#include<bits/stdc++. ...
- ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】
题意 给N个点,求最小的圆将这N个点全部覆盖,输出圆心坐标和半径 分析 最小的圆肯定落在三个点上,因此暴力枚举圆上的三个点即可,点增量算法O(n ^ 3),加入随机化,平均复杂度可以降到O(n^2) ...
- poj 2069 Super Star 模拟退火
题目大意: 给定三位空间上的n(\(n \leq 30\))个点,求最小的球覆盖掉所有的点. 题解: 貌似我们可以用类似于二维平面中的随机增量法瞎搞一下 但是我不会怎么搞 所以我们模拟退火就好了啊QA ...
- 【hdoj】3007 Buried memory 【计算几何--最小圆覆盖】
传送门:Buried memory 苍天饶过谁,第三次在hdoj上 交计算几何的题了,没一次是AC的. ┭┮﹏┭┮都是模板题啊,我都是抄板子的啊,为什么会这样,我怎么这么菜. 题意: 求最小圆覆盖 的 ...
- PKU2069 Super Star 点集最小外接球
变步长法属于模拟退火算法的一种.pku2790就可以使用这种方法求解. 题意:是求一些空间点集的最小外接球半径.选取一个初始点,然后按一定步长前进,前进的方向选择为指向最靠近它的点.不断让步长衰减,过 ...
- POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】
POJ 2069最小球覆盖 1.给定N个三维点,要求覆盖这些点的最小球半径: 2.采用模拟淬火算法,随机选取一个点作为初始解,然后不断向当前最远的点靠近: 3.这是一个不断调整的过程,对应模拟淬火算法 ...
- POJ-2069 Super Star(最小球覆盖)
POJ-2069 Super Star 题意: 给你n个点,求覆盖所有点的最小球的半径 4<=n<=30 题解: 求最小球覆盖的步骤: (1)对于一个点:球心就是这个点,且半径无穷小. ( ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
- poj 2096 , zoj 3329 , hdu 4035 —— 期望DP
题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...
最新文章
- iOS11开发教程(二十三)iOS11应用视图实现按钮的响应(3)
- springmvc和tomcat原理
- atitit.微信支付的教程文档 attilax总结
- 收藏网站制作常用经典css.div.布局.设计实例打包下载
- App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
- 抖音autojs 云控脚本源码
- 写了一个个人资产管理的后台系统
- 抖音电影视频剪辑——电影版权问题
- 2003sql php_Windows Server 2003下安装PHP +mssql2000
- java 扫描仪_Java调用扫描仪2
- 周末分享 | 2019年最好的演讲:别让任何人打乱你的人生节奏
- 【PTC Thingworx(三)】连接和监控工厂设备
- 实时折线图php mysql 源码_超级漂亮网址导航源码,自助链源码(PHP+MYSQL完整版)...
- UITT不忘初心,为交易而生
- 一个事物两个方面的对比举例_作比较的句子大全简短-对比的句子什么比什么重要-什么和什么做比较的句子...
- MySQL数据库,数据的约束
- 用pymysql批量导入数据
- 在Centos7下Hyperledger Cello安装部署和简单使用
- 升级XCode8之后控制台打印了好多乱七八糟的东西
- visio2016激活 试用版
热门文章
- Java摇骰子比大小_还在摇骰子比大小?这几款火热的KTV喝酒游戏你值得收藏
- php 判断文件类型,php 判断图片文件的真实类型
- redis 从节点如何选举从节点升级为主节点_Redis哨兵的配置和原理
- linux swing 字体颜色,Linux 下 java Swing 中文字体变成方框的问题解决
- hashmap删除指定key_「集合系列」- 深入浅出分析HashMap
- cropper左右移动_移动端cropper.js上传图片、裁剪
- worknc的后处理如何安装_这些压缩空气后处理问题,大部分人都没有关注到
- 现在进行时和一般现在时的将来时态_39
- Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)
- 无序列表圆点变空心_前端HTML -- 列表标签