洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
题目描述
如图:有n个重物,每个重物系在一条足够长的绳子上。每条绳子自上而下穿过桌面上的洞,然后系在一起。图中X处就是公共的绳结。假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到地上),且忽略所有的摩擦。
问绳结X最终平衡于何处。
注意:桌面上的洞都比绳结X小得多,所以即使某个重物特别重,绳结X也不可能穿过桌面上的洞掉下来,最多是卡在某个洞口处。
输入输出格式
输入格式:
文件的第一行为一个正整数n(1≤n≤1000),表示重物和洞的数目。接下来的n行,每行是3个整数:Xi.Yi.Wi,分别表示第i个洞的坐标以及第 i个重物的重量。(-10000≤x,y≤10000, 0<w≤1000 )
输出格式:
你的程序必须输出两个浮点数(保留小数点后三位),分别表示处于最终平衡状态时绳结X的横坐标和纵坐标。两个数以一个空格隔开。
输入输出样例
说明
[JSOI]
居然是道物理题QWQ...
我们所需要求的点,一定是总能量最小的点,这里的总能量,就是每个点的重力势能之和,如果让一个点的重力势能减小,那么拉它的绳子就应该尽量的长,那么在桌面上的绳子就应该尽量的短
因此我们需要求得一个点,使得$\sum_{1}^{n} d[i]*w[i]$最小($d[i]$表示该到平衡点的距离,$w[i]$表示该点的重量)
这样的话我们显然可以用模拟退火去求这个点
但此题正解并不是模拟退火,
用退火的时候大概有几个需要注意的地方
1.$\Delta T$要设的大一点,
2.移动的距离需要与温度有关
然后无脑退火就可以了
亲测时间种子用19260817可过
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstdlib>
#define Rand(T) T*( (rand()<<1) - RAND_MAX )
const int MAXN = 1e6 + ;
const double eps = 1e-;
using namespace std;
inline int read() {
char c = getchar();int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -;c = getchar();}
while(c >= '' && c <= '') {x = x * + c - '';c = getchar();}
return x * f;
}
int N;
struct Point {
double x, y, w;
}a[MAXN];
double AverX,AverY;
double calc(double x,double y) {
double ans = ;
for(int i = ; i <= N; i++)
ans += sqrt((x - a[i].x) * (x - a[i].x) + (y - a[i].y) * (y - a[i].y)) * a[i].w;
return ans;
}
int main() {
srand();
N = read();
for(int i = ; i <= N; i++)
scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].w),
AverX += a[i].x, AverY += a[i].y;
AverX /= N; AverY /= N;
double Best = calc(AverX, AverY), BestX = AverX, BestY = AverY;
double DelatT = 0.98;
int Time = ;
while(Time--) {
double Now = calc(AverX, AverY), NowX = AverX, NowY = AverY;
for(double T = ; T > eps; T *= DelatT) {
double Wx = NowX + Rand(T), Wy = NowY + Rand(T);
double Will = calc(Wx, Wy);
if(Will < Best) Best = Will, BestX = Wx, BestY = Wy;
if(Will < Now || ( exp((Will - Now) / T) * RAND_MAX < rand() ))
Now = Will, NowX = Wx, NowY = Wy;
}
}
printf("%.3lf %.3lf", BestX, BestY);
return ;
}
洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)的更多相关文章
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...
- [洛谷P1337][JSOI2004]平衡点 / 吊打XXX
题目大意:有$n$个重物,每个重物系在一条绳子上.所有绳子系在一起,问绳结最终平衡于何处. 题解:$NOIP$前学学模拟退火,但发现我脸好黑啊... 卡点:脸黑 C++ Code: #include ...
- 洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 先坑着,联赛活着回来的话我就写(意思就是我绝对不会写了) //minamoto #include<cstdio> #include<cmath> #include< ...
- P1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
链接 https://www.luogu.org/problemnew/show/P1337 思路 交了好多发,都是wrong 初始值取平均数就1A了 真的是玄学的算法 代码 // luogu-jud ...
- LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...
- luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
推荐博客:模拟退火总结(模拟退火)by FlashHu.模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值. 题目传送门:luogu1337 [JSO ...
- P1337 [JSOI2004]平衡点 / 吊打XXX
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- Luogu P1337 [JSOI2004]平衡点 / 吊打XXX
一道入门模拟退火的经典题,还是很考验RP的 首先我们发现神TM这道题又和物理扯上了关系,其实是一道求广义费马点的题目 首先我们可以根据物理知识得到,当系统处于平衡状态时,系统的总能量最小 又此时系统的 ...
随机推荐
- 常见排序算法整理(python实现 持续更新)
1 快速排序 快速排序是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行 ...
- linux下 几个常用makefile模板,亲测可用
一 生成动态链接库的模板: ####################### # Makefile ####################### # compile and lib parameter ...
- win7 Host文件修改后无效的解决办法
win7 Host文件修改后无效的解决办法 正常情况下hosts文件随时修改随时生效,如果出现修改后不生效的情况,首先确定文件是ascii编码,以windows格式为换行符,然后依次采用如下方法 1 ...
- Java提高(5)---map集合排序
map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按照成绩的好坏进行排序 ...
- 用dos命令导出一个文件夹里面所有文件的名字(装逼利器)
首先,当然是在相关的文件夹打开dos命令窗口. 然后,输入如下命令:dir/b >a.txt 如果你非常了解dos命令,那么你一定会觉得这个东西简单到爆,而且我的理解和猜想都有些无知. 但如果你 ...
- HttpSessionListener的用法
Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候. 这个接口也只包含两个方法,分别对应于Session的创建和失效: ...
- python练习三—解析xml
使用python解析xml,主要使用sax的ContentHandler中的标签开始和标签结束的方法驱动,然后在开始(或者结束)事件中决定使用什么处理方法,使用dispatcher来决定并分发到指定方 ...
- 各个系统下ping IP+端口的方法
前言 做开发的人员,可能都会遇到网络的一些问题.这时一般都需要测试指定的网络是否能正常访问.通常在windows系统下,在cmd里直接用命令ping指定的IP或者域名就可以快速的知道这个地址是否是可以 ...
- Ubuntu 安装网卡驱动
搭建Linux平台的无线热点,需要无线网卡和驱动都要支持 AP. 试了下Ubuntu平台默认驱动并不支持AP模式,所以需要更换驱动,具体操作步骤如下: 1.找到自己网卡芯片的型号,由于我的环境是搭建在 ...
- Python 与 Javascript 之比较
最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里.我觉得对于从Javascript转 ...