求调参
查看原帖
求调参
437398
EastIsRed楼主2024/1/4 16:25
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<climits>
#include<ctime>
#include<random>
#include<chrono>
#include<utility>
//#define debug
#define online_judge
int n,m,R;
struct point{
    double x,y;
    point(){}
    point(double _x,double _y):x(_x),y(_y)
    {
        #ifdef debug
        printf("creat point(%lf,%lf)\n",x,y);
        #endif // debug
    }
}enemy[1024];
double getdis(const point& lhs,const point& rhs)
{
    return sqrt((lhs.x-rhs.x)*(lhs.x-rhs.x)+(lhs.y-rhs.y)*(lhs.y*rhs.y));
}
struct circle:public point{
    int r;
}building[16];
double res;
double calc(const point& pos)
{
    double r=R,mn=1e10;
    int cnt=0;
    for(int i=1;i<=n;i++)
        r=std::min(r,getdis(pos,building[i])-building[i].r);
    if(r<0)
        return -1e10;
    for(int i=1;i<=m;i++)
    {
        double ndis=getdis(pos,enemy[i]);
        cnt+=(r>=ndis);
        mn=std::min(mn,ndis-r);
    }
    if(res<cnt)
        res=cnt;
    return cnt-std::max(mn,0.0)*14.15;
}
point now;
double nans;
//std::mt19937 rnd(std::chrono::high_resolution_clock::to_time_t(std::chrono::high_resolution_clock::now()));
void SA()
{
    for(double temp=5e3;temp>=1e-14;temp*=0.975)
    {
        point new_pos(now.x+((rand()<<1)-RAND_MAX)*sqrt(temp),now.y+((rand()<<1)-RAND_MAX)*sqrt(temp));
        double delta=calc(new_pos)-res;
        if(delta>=0)
            now=new_pos,res+=delta;
        else if(exp(delta/sqrt(temp))*RAND_MAX>rand())
            now=new_pos;
    }
}
int main()
{
    #ifdef online_judge
    clock_t st=clock();
    #endif // online_judge
    scanf("%d%d%d",&n,&m,&R);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf%d",&building[i].x,&building[i].y,&building[i].r);
    double sumx=0,sumy=0;
    for(int i=1;i<=m;i++)
    {
        scanf("%lf%lf",&enemy[i].x,&enemy[i].y);
        sumx+=enemy[i].x,sumy+=enemy[i].y;
    }
    #ifndef online_judge
    clock_t st=clock();
    #endif // online_judge
    now=point(sumx/m,sumy/m);
    nans=calc(now);
    srand(time(NULL));
    while(1.0*(clock()-st)/CLOCKS_PER_SEC<=0.85)
    //for(int i=1;i<=10;i++)
        SA();
    printf("%d",(int)res);
    return 0;
}

最高获得过20分,代码在与题解的对比中不断杂糅,救救孩子吧

2024/1/4 16:25
加载中...