• 【Luogu1337】平衡点(模拟退火)


    【Luogu1337】平衡点(模拟退火)

    题面

    洛谷

    题解

    和BZOJ3680吊打XXX是一样的。。
    但是数据很强呀。。
    疯狂调参
    各种WA。。。
    很无奈呀。。。。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    #include<ctime>
    using namespace std;
    #define ll long long
    #define RG register
    #define MAX 20000
    #define sqr(x) ((x)*(x))
    inline int read()
    {
        RG int x=0,t=1;RG char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-')t=-1,ch=getchar();
        while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
        return x*t;
    }
    struct Node{double x,y,w;}p[MAX],ans;
    double mm=1e100;
    int n;
    double Dis(Node a,Node b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
    double Calc(Node P)
    {
        double ret=0;
        for(int i=1;i<=n;++i)ret+=p[i].w*Dis(P,p[i]);
        if(ret<mm)mm=ret,ans=P;
        return ret;
    }
    double Rand(){return rand()%100000/100000.00;}
    void SA(double T)
    {
        Node now=ans;
        while(T>1e-3)
        {
            Node nw;
            nw.x=now.x+T*(2*Rand()-1);
            nw.y=now.y+T*(2*Rand()-1);
            double dlt=Calc(now)-Calc(nw);
            if(dlt>0||exp(dlt/T)>Rand())now=nw;
            T*=0.99;
        }
    	for(int i=1;i<=5000;++i)
    	{
            now.x=ans.x+T*(2*Rand()-1);
            now.y=ans.y+T*(2*Rand()-1);
            Calc(now);
        }
    }
    int main()
    {
    	srand(233);
        n=read();
        for(int i=1;i<=n;++i)ans.x+=p[i].x=read(),ans.y+=p[i].y=read(),p[i].w=read();
        ans.x/=n;ans.y/=n;Calc(ans);
    	SA(100000);
        printf("%.3lf %.3lf
    ",ans.x,ans.y);
        return 0;
    }
    
    
  • 相关阅读:
    c++ 与 c 的区别
    c++ 查看程序运行时间
    串口阻塞与非阻塞
    串口缓冲区
    马拉车算法
    printf 自加自减
    stack
    长度问题
    PCIE的内存地址空间、I/O地址空间和配置地址空间
    数组和指针
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8408910.html
Copyright © 2020-2023  润新知