[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太欧了,我交了一版没过他来了 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_5_定义和使用含有泛型的接口
定义泛型接口 Scanner的接口 接口的实现类.实现这个接口,规定数据类型为String类型 ArrayList是List接口的实现类 再看下List接口的源码 泛型实现类也定义为泛型 重写泛型的方 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_1_Map集合概述
map集合是双列集合 map有两个泛型.左边K也叫作键 右边V是value
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件
数据由内存写入到硬盘中 构造函数传的路径是一个相对路径.有异常需要捕获异常 释放资源 这三个方法,都有异常 IO异常是父类,所以这里只需要抛出IO异常就可以了. 运行程序.目录内多了个a.txt文件 ...
- tensorflow 关于 矩阵 运算 + 符号得含义。 2维 数组 + 1纬数组, 就是每一行都 加一边 1纬数组。 呵呵
小锋子Shawn(403568338) 13:51:23mnist.training.images?墨须(964489899) 13:51:27我的图片是100*100的,该怎么兼容. 小锋子S ...
- 类ThreadGroup
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 默认的情况下,所有的线程都属于主线程组. public final Thread ...
- Charls
1.连接设备 charles--proxy--proxy setting 设置端口号 charles--proxy--ssl proxy setting 设置代理域名 [pc端] charles--p ...
- 嗯,python
总觉得在这么个地方已经没有在碰blog的可能了...但是... 突然说要用python来配置环境...好歹也是这个专业的啊...还是 看看吧... 然后 百度一搜,看到一个 好的 网站,不知道 我一旦 ...
- js提交图片转换为base64
$("#picAjax").change(function () { var strs = ""; var file = $("#picAjax&qu ...
- <每日一题> Day8:CodeForces-996A.Hit the Lottery(贪心)
原题链接 因为数据太水,我直接一发暴力过了...... #include <cstdio> using namespace std; ] = {, , , , }; int main() ...
- SpringMVC处理器拦截器 Interceptor
拦截器概念 Java 里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种 ...