[JSOI2004]平衡点 / 吊打XXX 题解
预备概念:
金属退火:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却
温度:一个逐渐减小的参数,表示接受次优解的概率
模拟退火是一种解决复杂问题的算法,相当于贪心,但以一个逐渐减小的该率接受次优解,当然,该次优解距最优解越远,同等温度下被接受的概率也就越小
参考洛谷日报上某巨佬代码(主要是参考在何时接受次优解,生成正负随机数的技巧以及如何确定退火初值),打了一下洛咕P1337
接受次优解:
exp ( ( ans - cur ) / temp) * RAND_MAX > rand()
当前最优解 当前解 温度 定值,参考cstdlib 随机数
调参失败时具体技巧:
1:开始的随机种子一定要多随机几次(玄学???)
2:调节温度下降的速度(至少0.99以上QWQ)
3:合理调整最终答案的处值,模拟退火算法可以多执行几次,判定算法结束的条件精度高
4:用一些玄学数字:19******
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define ll long long
#define ri register int const int MAXN = ;
const int SA_TIME = ;
const double DELTA = 1e-; ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} int x[MAXN], y[MAXN], w[MAXN];
int n; double ansx = , ansy = , ans=1e18;
const double delta = 0.993; inline double getDis(double x1, double y1, double x2, double y2){
return (sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
} inline double cacEny(double curx,double cury){
double sum = ;
for (ri i = ; i <= n; ++i)
sum += getDis(x[i], y[i], curx, cury) * w[i];
return sum;
} inline int getRand(){
//需要返回负数,故特殊处理rand函数
return ((rand() << ) - RAND_MAX);
} inline void SA(){
double sx = ansx, sy = ansy, curx, cury;
double temp = ;
while (temp >= DELTA){
if (temp < )
temp = temp - + ;
curx = sx + getRand() * temp, cury = sy + getRand() * temp;
double cur_eny = cacEny(curx, cury);
if (cur_eny < ans){
sx = curx, sy = cury;
ansx = curx, ansy = cury, ans = cur_eny;
}//接受次优解
else {
if (exp((ans - cur_eny) / temp) * RAND_MAX > rand())
sx = curx, sy = cury;
}
temp *= delta;
}
} inline void Solve() {
int sumx = , sumy = ;
for (ri i = ; i <= n; ++i)
sumx += x[i], sumy += y[i];
ansx=(double)(sumx) / n, ansy=(double)(sumy) / n;
for (ri i = ; i <= SA_TIME; ++i)
SA();
} int main() {
srand(); srand(rand()); srand(rand()); srand(rand());
n = read();
for (ri i = ; i <= n; ++i)
x[i] = read(), y[i] = read(), w[i] = read();
Solve();
printf("%.3f %.3f\n", ansx, ansy);
return ;
}
未经博主允许禁止转载
参考资料:
洛谷日报2018年9月#60 地址 作者:M_sea
exp函数 地址 作者:百度百科
[JSOI2004]平衡点 / 吊打XXX 题解的更多相关文章
- BZOJ3680 & 洛谷1337:[JSOI2004]平衡点/吊打XXX——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 有n ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...
- luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
推荐博客:模拟退火总结(模拟退火)by FlashHu.模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值. 题目传送门:luogu1337 [JSO ...
- 题解:[JSOI2004]平衡点 / 吊打XXX
这个题目算是一个模拟退火的板子题 物重一定,绳子越短,重物越低,势能越小,势能又与物重成正比 使得$\sum_{i=1}^nd[i]*w[i]$也就是总的重力势能最小,可以使得系统平衡 交了两面半.. ...
- 题解 P1337 【[JSOI2004]平衡点 / 吊打XXX】
这道题调了好久,果然非洲人是得不到眷顾的吗... 本题采用模拟退火解决. 模拟退火是一种简洁明了而又高效的近似算法,基本上可以套到任何求最优解的题目上去. 它的原理是模拟物理中金属退火的现象,凭借选手 ...
- [luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】
题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有 ...
- LG1337 [JSOI2004]平衡点 / 吊打XXX
题意 题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不 ...
- LG1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
问题描述 LG1337 题解 模拟退火模板 记住概率公式: \(exp(\frac{dealt}{T}) \times rand \ge R_A^ND^M_AX\) zzk太欧了,我交了一版没过他来了 ...
随机推荐
- log4j.rootLogger作用域
log4j.rootLogger只对没有申明appender的包起作用:
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_7_可变参数
打印出来是一个数组的地址 打印数组的长度 只要调用了add方法就会创建一各长度为0的数组 传一个10过去.就输出了数组的长度为1 传两个数字 注意事项: 特殊写法
- CentOS 6 安装Syslog-ng
entOS 6 安装 Syslog-ng 一. yum 安装 syslog-ng3.7.1 是专门用于RHEL/CentOS version 6 ,不要安装成其他版本.亲身经历,安装成syslog-n ...
- oracle--groupby分组学习
使用group by分组 在多行函数中不能直接使用普通字段,除非group by 在多行函数中不能直接使用单行函数,除非group by group by学习: ---1.使用group by进行数据 ...
- web 前端1 html5基础
HTML web sockent 实例 import socket def handle_request(client): buf = client.recv(1024) client.sendall ...
- [Python3] 005 列表的基本使用
目录 1. 列表概述 2. 创建列表 3. 列表常用操作 (1) 访问列表 (2) 分片操作 1) 正向操作 2) 反向操作 3) 内置函数 id() 加入队伍 1. 列表概述 一组有顺序的数据的组合 ...
- ubuntu系统下navicat 试用到期解决方案
作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 1.直接删除 /home目录下的 .navicat文件夹(此文件夹隐藏),如果你是64位,文件夹名称可 ...
- SCUT - 271 - CC 非诚勿扰 - FFT
https://scut.online/p/271 第一次遇到没这么裸的,其实感觉到是卷积但是不知道怎么化.看来以后要多注意下标. #include <bits/stdc++.h> usi ...
- Python内建函数reduce()用法
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,下面讲述Python内建函数reduce()用法. ...
- FFmpeg从入门到出家(HEVC在RTMP中的扩展)
由金山云视频云技术团队提供:FFmpeg从入门到出家第三季: 为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具 ...