题意:给定几个点,要求覆盖这些点的最小球半径。(求到n个点的最大距离最小化的点
因为是单峰的所以可以用爬山算法
主要是我的退火算法板子精度达不到?

//#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <stdlib.h>
#include <ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 1e4 + 5;
int n;
double X,Y;
struct point
{double x,y,z;
} p[maxn],pp;
double ans=1e10;
double dis(point a,point b)
{return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
int get(point x)
{double res=-1;int k;for(int i=1; i<=n; ++i){double m=dis(p[i],x);if(m>res)res=m,k=i;}ans=min(ans,dis(x,p[k]));return k;
}
void hc()
{double  T=1,eps=1e-10;while(T>eps){//if(pp.x<=X&&pp.y<=Y&&pp.x>=0&&pp.y>=0)// {int k=get(pp);pp.x=pp.x+(p[k].x-pp.x)*T;pp.y=pp.y+(p[k].y-pp.y)*T;pp.z=pp.z+(p[k].z-pp.z)*T;// }T*=0.9996;}
}
int  main()
{double X,Y;while(scanf("%d",&n)!=EOF){if(n==0)break;pp.x=pp.y=pp.z=0;for(int i=1; i<=n; ++i){cin>>p[i].x>>p[i].y>>p[i].z;pp.x+=p[i].x,pp.y+=p[i].y,pp.z+=p[i].z;}pp.x/=n;pp.y/=n;pp.z/=n;ans=1e10;hc();// printf("(%.1f,%.1f).\n",pp.x,pp.y,pp.z);printf("%.5f\n",sqrt(ans));}return 0;
}

退火没有A掉:

///退火算法
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <stdlib.h>
#include <ctime>
#define mp              make_pair
#define io              ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 5;
int n, x, y;
struct point { double x, y, z; } p[maxn], now, nex, ansp;double dis(point a, point b) { return ((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z)); }double f(point x)
{  //评估函数double res = 0;for (int i = 1;i <= n;i++) res = max(res, dis(x, p[i]));return res;
}
long double ans = 1e20;//最开始的能量值,初始很大就可以,不用修改
void sa()
{ans = 1e22;double T = 100;       //初始温度,         (可以适当修改,最好和给的数据最大范围相同,或者缩小其原来0.1)double d = 0.9999;      //降温系数          (可以适当修改,影响结果的精度和循环的次数,)double eps = 1e-10;    //最终温度          (要是因为精度问题,可以适当减小最终温度)double TT = 1.0;      //采纳新解的初始概率double dd = 0.999;    //(可以适当修改,采纳新解变更的概率)(这个概率下面新解更新的时候,最好和未采纳的新解更新的次数是一半一半)double res = f(now);  //传入的初始默认解(now)下得到的评估能量值if (res < ans) ans = res, ansp = now;//ansp终解int cnt=0;while (T > eps){for (int i = -1;i <= 1;++i)for (int j = -1;j <= 1;++j)if ((now.x+T*i<=100)&&(now.x+T*i>=0)&&(now.y+T*j<=100)&&(now.y+T*j>=0)){nex.x = now.x + T * i, nex.y = now.y + T * j;//新解double tmp = f(nex);//新解下的评估能量值if (tmp < ans) ans = tmp, ansp = nex;//降温成功,更新当前最优解if (tmp < res) res = tmp, now = nex;// 降温成功,采纳新解else if (TT > rand() % 10000 / 10000.0) res = tmp, now = nex;//,cout<<"======"<<endl;//没有 降温成功,但是以一定的概率采纳新解//else cout<<"="<<endl;//用于测试,设定的采纳新解的概率,是否为一半一半,可以适当修改降温参数dd}cnt++;T *= d; TT *= dd;}//cout<<cnt<<endl;
}
int main()
{srand(time(0));while (scanf("%d", &n)!=EOF) {if (n == 0)break;now.x = now.y = 0, now.z = 0;for (int i = 1;i <= n;++i){cin >> p[i].x >> p[i].y >> p[i].z;//scanf("%lf%lf%lf",&p[i].x,&p[i].y),now.x += p[i].x, now.y += p[i].y, now.z += p[i].z;}now.x = now.y = 55, now.z = 55;sa();//now.x /= n, now.y /= n, now.z /= n;sa();//now.x = now.y = 20, now.z = 20;sa();printf("%.5Lf\n", sqrt(ans));//cout<<ans<<endl;}return 0;
}

poj 2069 Super Star 最小求覆盖【爬山算法】相关推荐

  1. POJ - 2069 Super Star HDU - 3007 Buried memory

    模拟退火求最小球覆盖和最小圆覆盖 原本在我的认识中,模拟退火一定要有一个随机化在里面. 但是有些模拟退火,你可以清楚地意识到答案是可以向某个方向逼近的,这个时候就不用随机了. 比如像第一道题POJ 2 ...

  2. poj 2069 Super Star 模拟退火

    题目大意: 给定三位空间上的n(\(n \leq 30\))个点,求最小的球覆盖掉所有的点. 题解: 貌似我们可以用类似于二维平面中的随机增量法瞎搞一下 但是我不会怎么搞 所以我们模拟退火就好了啊QA ...

  3. POJ-2069 Super Star(最小球覆盖)

    POJ-2069 Super Star 题意: 给你n个点,求覆盖所有点的最小球的半径 4<=n<=30 题解: 求最小球覆盖的步骤: (1)对于一个点:球心就是这个点,且半径无穷小. ( ...

  4. poj 2594 Treasure Exploration 最小路径覆盖

    题目链接:http://poj.org/problem?id=2594 建图很重要!!! 大致题意: 给出一个由n个顶点m条边组成的有向无环图.求最少可以同时存在多少路径,使得这些路径可以覆盖所有的点 ...

  5. POJ - 2594 Treasure Exploration(最小路径覆盖-二分图最大匹配+传递闭包)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要让最少的机器人沿着图遍历所有点,求出最少需要机器人的数量,注意每个点可以重复遍历 题目分析:因为要遍历所有点,所以还是变成了二分图的最小路径覆盖问 ...

  6. POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...

  7. POJ 1422 Air Raid (最小路径覆盖)

    题意 给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点.且每个点只被一个伞兵走一次.问至少放多少伞兵. 思路 裸的最小路径覆盖. °最小路径覆盖 [路径覆盖]在一个有向图G( ...

  8. java最小子串覆盖_Java 算法-最小子串覆盖

    今天在lintCode上做了一道题,感觉有必要将它记录下来. 1. 概览 (1).题意 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. ...

  9. 爬山算法 求解 最小“球”覆盖 POJ 2069 /2018 南京现场D

    题意: 给出三维空间中的一些坐标,任选空间一点使得该点到N个点的最大距离最小. 思路: 可以发现,即求这些点的最小球半径,同时,初始化球心后,更优解一定大概在该 心与当前最远点连线的方向,且在这条线上 ...

最新文章

  1. 【怎样写代码】参数化类型 -- 泛型(六):泛型接口
  2. python知识点:文件读写以及其他基础知识点
  3. Log4j格式化符号
  4. 我的职业规划是什么呢?什么都要写写画画才行
  5. 元宵节来了,程序员用 Python 送你一盏 3D 花灯
  6. ubuntu上建立mini2440 qt编译环境
  7. 深入理解ASCII,Unicode和UTF-8编码
  8. 1.2 线性回归与梯度下降-机器学习笔记-斯坦福吴恩达教授
  9. 软件测试术语中英文对照(部分)
  10. 数据结构(5) -- 图
  11. rest接口_深度干货 | 测试REST服务接口
  12. ArcGIS如何在一个矢量上用不同颜色进行标注
  13. Linux系统编程25:基础IO之亲自实现一个动静态库
  14. 使用ASP .NET (C#) 產生PDF檔的好幫手—iTextSharp library (上)
  15. 最近一周交易所钱包比特币数量减少18425枚
  16. c++中goto语句用法
  17. 实例构造函数与静态构造函数执行顺序
  18. 快速打开ofd文件发票转换pdf格式发票方法
  19. c语言中十进制转化二进制八进制十六进制,十进制转化为二进制八进制十六进制...
  20. css动感线条,使用css3制作动感导航条示例

热门文章

  1. nullnullDataTable 排序
  2. C语言程序的存储区域
  3. 如何在PySide中使用qrc资源文件
  4. Doxygen基本用法
  5. 听易中天品三国---看孔融,杨修之死
  6. linux设备和驱动加载的先后顺序
  7. React状态管理大乱斗,横向对比Dva,Rematch,Mirror
  8. 微信小程序——获取所有资讯接口数据
  9. linux 使用FIO测试磁盘iops
  10. 中小企业实施ERP更多是需要发展的眼光与坚定的决策