模拟退火板子 求空间上一点到所有点距离最小

#include<bits/stdc++.h>
using namespace std;
const int N=110;
#define pdd pair<double,double>
pdd q[N];
int n;
double rand(double l,double r)
{
    return (double)rand()/RAND_MAX*(r-l)+l;
}
double ans=1e18;
double calc(double x,double y)
{
    double res=0;
    for(int i=0;i<n;i++)
    res+=sqrt((q[i].first-x)*(q[i].first-x)+(q[i].second-y)*(q[i].second-y));
    ans=min(res,ans);
    return res;
}
void simulata_anneal()
{
    pdd cur(rand(0,10000),rand(0,10000));
    for(double T=10000;T>1e-4;T*=0.99)
    {
        pdd np(rand(cur.first-T,cur.first+T),rand(cur.second-T,cur.second+T));
        double dt=calc(np.first,np.second)-calc(cur.first,cur.second);
        if(exp(-dt/T)>rand(0,1))    cur=np;
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>q[i].first>>q[i].second;
    for(int i=0;i<100;i++)
    simulata_anneal();
    printf("%.0lf\n",ans);
    return 0;
}
全部评论

相关推荐

过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务