洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
模拟退火模板题,我们的目标是minimize
其中
故相当于我们要在一个空间内找一个点,具有最优性质
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> using namespace std; class HOLE { public: void Set(int _x, int _y, int _w) { x = _x; y = _y; w = _w; } double Wg(double X, double Y) { return sqrt((X - x) * (X - x) + (Y - y) * (Y - y)) * w; } private: double x, y, w; }; HOLE hole[1010]; double cal_val(double x, double y, int n) { double ret = 0; for (int i = 1; i <= n; i++) { ret += hole[i].Wg(x, y); } return ret; } void sa(double& x0, double& y0, int n) { double Temperature = 5000; double zeroT = 1e-15; double down_rate = 0.004; double ansval = cal_val(x0, y0, n); int cnt = 0; while (Temperature > zeroT) { double newx = x0 + (rand() * 2 - RAND_MAX) * Temperature; double newy = y0 + (rand() * 2 - RAND_MAX) * Temperature; double newval = cal_val(newx, newy, n); double delta_val = newval - ansval; if (delta_val < 0) { x0 = newx; y0 = newy; ansval = newval; } else if (rand() < exp(-delta_val / Temperature) * RAND_MAX) { x0 = newx; y0 = newy; } Temperature *= 1 - down_rate; } } int main() { srand(623223771); int n; cin >> n; double ansx = 0, ansy = 0; for (int i = 1; i <= n; i++) { int x, y, w; cin >> x >> y >> w; hole[i].Set(x, y, w); ansx += x; ansy += y; } ansx /= n; ansy /= n; for (int i = 1; i <= 5; i++) { sa(ansx, ansy, n); } printf("%.3lf %.3lf\n", ansx, ansy); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验