[luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】
题目描述
gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了。蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动。蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助。
不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上。
分析
模拟退火的链接:https://www.cnblogs.com/chhokmah/p/10529114.html
人生中第一道模拟退火题目,感觉模拟退火这个算法非常的优美又非常的(粗鄙之语)。我看不大懂网上那些乱七八糟的什么物理解释,我认为模拟退火就可以用一句话来概括:随机化乱搞,越搞几率越低。而且模拟退火的代码非常简单,但是最最麻烦的就是调参数。
有空的时候我会把模拟退火的学习笔记补起来。
回到这道题目,我们是要找到一个点,使其的合力为\(0\),那么我们首先假设答案就是我们所有点的中点,也就是所有点坐标的平均数,假设这个是我们的答案。然后我们就需要模拟退火找到比这个更好的答案。
我们可以确定一个原点,将所有的力在这个原点上正交分解,最终我们可以得到所有的力的一个合力,而真正的平衡点一定在合力所指向的方向。
每当分得到一个合力之后,将原点在合力的方向上位移一定的距离。每当原点位移的方向发生了改变的时候,缩小以后操作的位移距离。例如:上次操作是将原点像 x 轴正方向移动,而当前移动是将原点像 x 轴负方向上移动,这说明原点的横坐标一定在这两次假设的原点的横坐标中间,因此我们缩小以后原点移动的距离。
ac代码
#include <bits/stdc++.h>
#define db double
#define N 1005
using namespace std;
struct node {
db x, y, w, tot;
}a[N], ans;
int n;
db sqr(db x) {
return x * x;
}
db dist(node a, node b) {
return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
}
db calc(node p) {
db res = 0;
for (int i = 1; i <= n; i ++)
res += a[i].w * dist(p, a[i]);
return res;
}
db Rand() {
return rand() % 10000 / 10000.0;
}
void SA(db T) {
node now = ans, nw;
double delta;
while (T > 1e-4) {
nw.x = now.x + T * (2 * Rand() - 1);
nw.y = now.y + T * (2 * Rand() - 1);
nw.tot = calc(nw);
if (nw.tot < now.tot || exp((now.tot - nw.tot) / T) > Rand()) now = nw;
if (nw.tot < ans.tot) ans = nw;
T = T * 0.98;
}
for (int i = 1; i <= 1500; i ++) {
nw.x = ans.x + T * (2 * Rand() - 1);
nw.y = ans.y + T * (2 * Rand() - 1);
nw.tot = calc(nw);
if (nw.tot < ans.tot) ans = nw;
}
}
int main() {
srand(20040127);
scanf("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].w);
ans.x += a[i].x;
ans.y += a[i].y;
}
ans.x /= n;
ans.y /= n;
ans.tot = calc(ans);
for (int i = 1; i <= 150; i ++) SA(100000);
printf("%.3lf %.3lf\n", ans.x, ans.y);
return 0;
}
[luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】的更多相关文章
- luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
推荐博客:模拟退火总结(模拟退火)by FlashHu.模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值. 题目传送门:luogu1337 [JSO ...
- 洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- LG1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
问题描述 LG1337 题解 模拟退火模板 记住概率公式: \(exp(\frac{dealt}{T}) \times rand \ge R_A^ND^M_AX\) zzk太欧了,我交了一版没过他来了 ...
- [BZOJ3680][JSOI2004]平衡点 / 吊打XXX
BZOJ Luogu (洛谷和BZOJ上的数据范围不同,可能需要稍微调一调参数) sol 这题的参数调得我心累 模拟退火的模型可以形象地理解为:不断降温的小球在一个凹凸不平的平面上反复横跳,根据万有引 ...
- JSOI2004 平衡点 / 吊打XXX [模拟退火]
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...
- P1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
链接 https://www.luogu.org/problemnew/show/P1337 思路 交了好多发,都是wrong 初始值取平均数就1A了 真的是玄学的算法 代码 // luogu-jud ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...
随机推荐
- iOS悬浮窗口(无论界面跳转、View始终在视图上显示,可移动)
2016.09.24 23:52* 字数 71 阅读 5925评论 9喜欢 11 让所有界面都显示,最好还是封装一个继承Window的类:JYCWindow. 先看看效果: mygif.gif 关 ...
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- CodeForces Round #529 Div.3
http://codeforces.com/contest/1095 A. Repeating Cipher #include <bits/stdc++.h> using namespac ...
- ntpd、ntpdate、hwclock的区别
hwclock --systohc 使用ntpdate更新系统时间 - 潜龙勿用 - CSDN博客https://blog.csdn.net/suer0101/article/details/7868 ...
- WCF使用相关
1.不显示WCF服务主机 在WCF项目属性中的WCF选项卡总关闭下图的选项 2.在其他项目中承载WCF服务 其他加载的操作一致,需要把WCF的endpoint和behavior节点复制到 启动服务的那 ...
- 手机移动端input date placehoder不显示
要解决这个问题,我们可以伪造一个placehoder,通过css跟js来解决这个问题. 为什么要用js的原因是因为当你选择了时间之后,placehoder的文字没有清除掉,所以我们就需要把这个伪造的p ...
- PHP--高级算法--面试
数据结构和算法(转载) 原文地址: https://blog.csdn.net/s1070/article/details/51174725 1.使对象可以像数组一样进行foreach循环,要求属性 ...
- Python自动化运维之pexpect从入门到精通
1. 应用场景 模拟ssh, telnet远程登录, 模拟ftp文件上传 2. 安装 参考资料: <pexpect实例分析>https://www.ibm.com/developerwor ...
- Lodop打印控件 如何打印虚线
Lodop提供了打印设计可以方便开发人员的开发,预览是打印的反显,可以显示出打印效果,但是在开发时,还是要用虚拟打印机实际测试,(win7以上系统可能自带xps虚拟打印机 Microsoft XPS ...
- 11.ingress服务
kubernetes 的service服务我们提到过.service 可以用nodePort的方式和调用公有云LBAAS服务 来对于集群外的client提供服务访问,但是service是工作的osi ...