[JSOI2004]平衡点 / 吊打XXX

考虑模拟退火。

题目要我们找到一个点,使得整个系统平衡。

这个要求等价于让我们找到一个点,使得系统总能量最小。

我们退火出一个点,然后计算其能量即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #define N 10005
 9 using namespace std;
10 int read()
11 {
12     int x=0,f=1;char ch=getchar();
13     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
14     while(ch>=‘0‘&&ch<=‘9‘){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
15     return x*f;
16 }
17 struct node
18 {
19     int x,y,w;
20 }a[N];
21 int n;
22 double t,ansx,ansy,sx,sy,ans=1e18;
23 const double delta=0.993;
24 double calc(double x,double y)
25 {
26     double res=0;
27     for(int i=1;i<=n;i++)
28     {
29         double dtx=x-a[i].x,dty=y-a[i].y;
30         res+=sqrt((dtx*dtx)+(dty*dty))*a[i].w;
31     }
32     return res;
33 }
34 void SA()
35 {
36     double x=ansx,y=ansy;
37     t=2137;
38     while(t>1e-14)
39     {
40         double X=x+((rand()<<1)-RAND_MAX)*t;
41         double Y=y+((rand()<<1)-RAND_MAX)*t;
42         double now=calc(X,Y);
43         double D=now-ans;
44         if(D<0)
45         {
46             x=X;y=Y;
47             ansx=x;ansy=y;ans=now;
48         }
49         else if(exp(-D/t)*RAND_MAX>rand())x=X,y=Y;
50         t*=delta;
51     }
52 }
53 void solve()
54 {
55     ansx=(double)sx/n;ansy=(double)sy/n;
56     SA();
57     SA();
58     SA();
59     SA();SA();
60 }
61 int main()
62 {
63     srand(44042137);
64     n=read();
65     for(int i=1;i<=n;i++)
66     {
67         a[i].x=read();a[i].y=read();a[i].w=read();
68         sx+=a[i].x;sy+=a[i].y;
69     }
70     solve();
71     printf("%.3lf %.3lf\n",ansx,ansy);
72     return 0;
73 }

原文地址:https://www.cnblogs.com/szmssf/p/11555752.html

时间: 2024-10-09 14:35:52

[JSOI2004]平衡点 / 吊打XXX的相关文章

P1337 [JSOI2004]平衡点 吊打XXX - 模拟退火

P1337 [JSOI2004]平衡点 吊打XXX 模拟退火 初始温度\(T_0\) 终止温度\(T_k\) 温度变化率\(d\) \(T_k\)略大于0,\(d\)略小于1 当前状态\(x,y\) 当前解\(E\) 当前最优解\(minE\) 当前温度\(T\) 新状态\(nx,ny\) 新解\(nE\) 新解与当前解差值\(\Delta E = nE-E\) \(if\)新解比当前解更优\(nE<E\) 当前状态\(x,y\)移动到 \(nx,ny\) 当前解\(E\)移动到\(nE\) $

[luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX

题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助. 不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. 分析 人生中第一道模拟退火题目,感觉模拟退火这个算法非常的优美又非常的(粗鄙之

洛谷P1337 【[JSOI2004]平衡点 / 吊打XXX】(模拟退火)

洛谷题目传送门 很可惜,充满Mo力的Mo拟退火并不是正解.不过这是一道最适合开始入手Mo拟退火的好题. 对模拟退火还不是很清楚的可以看一下 这道题还真和能量有点关系.达到平衡稳态的时候,物体的总能量应该是最小的.而总的能量来源于每个物体的重力势能之和.要想让某个物体势能减小,那就让拉着它的绳子在桌面下方的长度尽可能的长,也就是桌面上的要尽可能短.由此看来,某个物体的势能与桌面上的绳子的长度.物体重量都成正比. 于是,为了找到平衡点,我们要找一个点使得\(\sum_{i=1}^n d_i*w_i\

P1337 [JSOI2004]平衡点 / 吊打XXX

题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到地上),且忽略所有的摩擦. 问绳结X最终平衡于何处. 注意:桌面上的洞都比绳结X小得多,所以即使某个重物特别重,绳结X也不可能穿过桌面上的洞掉下来,最多是卡在某个洞口处. 输入输出格式 输入格式: 文件的第一行为一个正整数n(1≤n≤1000),表示重物和洞的数目.接下来的n行,每行是3个整数:Xi

吊打XXX

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 2670  Solved: 984[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由

【BZOJ3680】吊打XXX 模拟退火

[BZOJ3680]吊打XXX Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助.不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. Input 输入第一行为一个正整数

BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现

【BZOJ3680】吊打XXX(模拟退火)

[BZOJ3680]吊打XXX(模拟退火) 题面 BZOJ 题解 模拟退火... 就是模拟退火 然后这题有毒 各种调参数之后终于\(AC\)了.. 这种题就是玄学呀... 温度要调大 最后跑完还要向四周多\(rand\)几次 保证能够找到最优解... #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<

BZOJ 3680 吊打XXX

Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助.不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. Input 输入第一行为一个正整数n(1<=n<=10000),