poj 2069 Super Star——模拟退火(收敛)
题目:http://poj.org/problem?id=2069
不是随机走,而是每次向最远的点逼近。而且也不是向该点逼近随意值,而是按那个比例;这样就总是接受,但答案还是要取min更新。
不知那个比例是怎么算。不过如果直接随机走或者向那个方向随机走的话,就过不了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<ctime> #include<cmath> #include<cstdlib> #define db double #define ll long long using namespace std; const int N=35; const db dc=0.997,eps=1e-17,INF=105; int n; db nx[N],ny[N],nz[N],px,py,pz,ans; db dis(db x0,db y0,db z0,db x1,db y1,db z1) { return sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)+(z0-z1)*(z0-z1)); } void SA(db T) { db x=px,y=py,z=pz,pr=ans;int id; while(T>eps) { db d=0; for(int i=1;i<=n;i++) { db tmp=dis(x,y,z,nx[i],ny[i],nz[i]); if(tmp>d)d=tmp,id=i; } ans=min(ans,d); x=x+(nx[id]-x)/d*T;y=y+(ny[id]-y)/d*T;z=z+(nz[id]-z)/d*T; T*=dc; } } int main() { srand(time(0)); while(1) { scanf("%d",&n);if(!n)return 0; for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&nx[i],&ny[i],&nz[i]),px+=nx[i],py+=ny[i],pz+=nz[i]; px/=n;py/=n;pz/=n; for(int i=1;i<=n;i++) ans=max(ans,dis(px,py,pz,nx[i],ny[i],nz[i])); SA(10000); printf("%.5lf\n",ans); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用