反正应该是代码本身的问题,麻烦帮忙改改
查看原帖
反正应该是代码本身的问题,麻烦帮忙改改
767748
__2009楼主2024/7/25 20:11
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
int n,m;
double R;
double x[20],y[20],r[20];
double p[1010],q[1010];
double ansx,ansy,ans;
double nowx,nowy;
double Random(){return (double)rand()/RAND_MAX;}
bool check(double xx,double yy);
int calc(double xx,double yy);
void simulateAnneal();
void doit(double mxx,double mxy,double mnx,double mny){
    ansx=(mxx-mnx==0)?mnx:(double)(rand()%(int)(mxx-mnx)+mnx);
    ansy=(mxy-mny==0)?mny:(double)(rand()%(int)(mxy-mny)+mny);
    nowx=ansx;nowy=ansy;
    ans=calc(ansx,ansy);
    simulateAnneal();
}
int main(){
    srand(time(NULL));
    cin>>n>>m>>R;
    double mxx=0,mxy=0,mnx=0x7fffffff,mny=0x7fffffff;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i]>>r[i];
    }
    for(int i=1;i<=m;i++){
        cin>>p[i]>>q[i];
        mxx=max(mxx,p[i]);
        mxy=max(mxy,q[i]);
        mnx=min(mnx,p[i]);
        mny=min(mny,q[i]);
    }
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    doit(mxx,mxy,mnx,mny);
    cout<<ans<<'\n';
    return 0;
}
int calc(double xx,double yy){
    double rrr=-1.0;
    for(int i=1;i<=n;i++){
        rrr=max(rrr,sqrt((xx-x[i])*(xx-x[i])+(yy-y[i])*(yy-y[i]))-r[i]);
    }
    rrr=min(R,rrr);
    int res=0;
    for(int i=1;i<=m;i++){
        if(sqrt((xx-p[i])*(xx-p[i])+(yy-q[i])*(yy-q[i]))<=rrr)res++;
    }
    if(res>ans){
        ans=res;
        ansx=xx;
        ansy=yy;
    }
    return res;
}
void simulateAnneal(){
    double t=29000;
    while(t>0.0001){
        double nxtx=nowx+t*(Random()*2-1)/2;
        double nxty=nowy+t*(Random()*2-1)/2;
        double delta=calc(nxtx,nxty)-calc(nowx,nowy);
        if(exp(-delta/t)>Random()){
            nowx=nxtx;
            nowy=nxty;
        }
        t*=0.999;
    }
    for(int i=1;i<=1000;i++){
        double nxtx=ansx+t*(Random()*2-1)/2;
        double nxty=ansy+t*(Random()*2-1)/2;
        calc(nxtx,nxty);
    }
}
2024/7/25 20:11
加载中...