题解

求一个最小的半径的球,包括三维平面上所有的点,输出半径

随机移动球心,半径即为距离最远的点,移动的方式是向离的最远的那个点移动一点,之后模拟退火就好

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
//#define ivorysi
#define MAXN 105
#define eps 1e-8
#define pb push_back
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
struct Point {
db x,y,z;
Point(db _x = 0,db _y = 0,db _z = 0) {
x = _x;y = _y;z = _z;
}
}P[35];
int N;
u32 Rand() {
static u32 x = 1736382156;
return x += x << 2 | 1;
}
db Rand_p() {
return (db) (Rand() % 10000) / 10000;
}
inline db o(db x) {return x * x;}
db dist(Point a,Point b) {
return sqrt(o(a.x - b.x) + o(a.y - b.y) + o(a.z - b.z));
}
db get_radius(Point a) {
db res = dist(a,P[1]);
for(int i = 2 ; i <= N ; ++i) res = max(res,dist(P[i],a));
return res;
}
int get_farthest(Point a) {
int r = 1;
for(int i = 2 ; i <= N ; ++i) {
if(dist(a,P[i]) > dist(a,P[r])) r = i;
}
return r;
}
void Solve() {
db delta = 0.99,T = 1000;
db now = get_radius(P[1]),ans = now;
Point s = P[1];
while(T > eps) {
ans = min(ans,now);
int c = get_farthest(s);
db d = dist(P[c],s);
Point t = Point(s.x + (P[c].x - s.x) / d * T,s.y + (P[c].y - s.y) / d * T,s.z + (P[c].z - s.z) / d * T);
db r = get_radius(t);
if(r <= now) {
now = r,s = t;
}
else {
if(exp((now - r) / T) > Rand_p()) {
now = r,s = t;
}
}
T *= delta;
}
printf("%.5f\n",ans);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
while(scanf("%d",&N) != EOF && N) {
for(int i = 1 ; i <= N ; ++i) {
scanf("%lf%lf%lf",&P[i].x,&P[i].y,&P[i].z);
}
Solve();
}
}

最新文章

  1. WinForm------TreeList属性介绍
  2. MVC授权认证
  3. Glide 下载Gif文件
  4. PHP中使用Session配合Javascript实现文件上传进度条功能
  5. android strings.xml 报 is not translated in af,
  6. Django中国|Django中文社区——python、django爱好者交流社区
  7. Java分布式优秀资源集合
  8. Eclipse下安装/配置Jrebel6.X
  9. L - Cat VS Dog - HDU 3829(最大独立集)
  10. JS字符串拼接优化
  11. css修炼宝典
  12. Java 的字节流文件读取(一)
  13. jquery 选择器、筛选器、事件绑定与事件委派
  14. ASP.NET Core 中使用EF Core 将实体映射到数据库表的方法(SQL Server)
  15. CENTOS 升级Nodejs 到最新版本
  16. 区间DP初探 P1880 [NOI1995]石子合并
  17. servlet里的过滤器filter
  18. Berlin 10.1 支持 iPhone 4 (iOS v7.x)
  19. 「Vue」v-html生成的图片大小无法调整的解决办法
  20. PO_全局一揽子采购协议(流程)

热门文章

  1. git简单使用总结
  2. numpy取反操作符和Boolean类型
  3. windows设置代理.bat 脚本
  4. 小记 百度地图 soso地图 经纬度偏移
  5. 漂亮!Javascript代码模仿淘宝宝贝搜索结果的分页显示效果
  6. HDU 4548 美素数 在线打表加数状数组
  7. 【leetcode 简单】 第一百一十二题 重复的子字符串
  8. InnoDB 引擎独立表空间
  9. asp.net 调用post方法并获取返回值
  10. 《区块链100问》第82集:应用类项目Golem