當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】
生活随笔
收集整理的這篇文章主要介紹了
P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P1337
題目大意
nnn個點有重量wiw_iwi?,求重心。
解題思路
模擬退火隨機找一個重心然后不斷接近即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; const int N=1100; const double Delit=0.993; int n;double x[N],y[N],v[N],ansx,ansy,ans; double calc(double nx,double ny){double ans=0;for(int i=1;i<=n;i++){double zx=x[i]-nx,zy=y[i]-ny;ans+=sqrt(zx*zx+zy*zy)*v[i];}return ans; } void S_A(){double x=ansx,y=ansy;double t=2000;while(t>1e-14){double nx=x+((rand()<<1)-RAND_MAX)*t;double ny=y+((rand()<<1)-RAND_MAX)*t;double now=calc(nx,ny),k=now-ans; double now=calc(nx,ny),k=now-ans;printf("%d %lf %lf %lf\n",rand(),nx,ny,now);break;if(k<0){ans=now;x=nx;y=ny;ansx=nx;ansy=ny;}else if(exp(-k/t)*RAND_MAX>rand())x=nx,y=ny;t=t*Delit;}return; } void Solve(){ansx/=n;ansy/=n;ans=calc(ansx,ansy);S_A();S_A();S_A();return; } int main() {srand(19260817);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf%lf",&x[i],&y[i],&v[i]);ansx+=x[i];ansy+=y[i];}Solve();printf("%.3lf %.3lf",ansx,ansy); }總結(jié)
以上是生活随笔為你收集整理的P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑C盘变红怎么办电脑c盘变红了怎么办
- 下一篇: P3959-宝藏【模拟退火】