蒟蒻今天刚学的玄学退火...
除了Metropolis准则完全搞不懂以外还不怎么会调参,以至于现在都不知道是WA在调参上还是算法上www
代码如下:
#pragma GCC opitimize(2)
#pragma GCC opitimize(3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<ctime>
using namespace std;
#define int double
#define re register long
const int cool=0.998;
//const int mintemp=1e-15;
const long N=15;
const long M=1e3+5;
int n,m,r,ansx,ansy;
struct Building{
int x;
int y;
int r;
}builds[N];
struct Node{
int x;
int y;
}enemy[M];
long ans;
inline long kill(int x,int y)
{
int minr=r;
long cnt=0;
for(re i=1;i<=n;++i)
minr=min(minr,sqrt(pow(x-builds[i].x,2)+pow(y-builds[i].y,2))-builds[i].r);
for(re i=1;i<=m;++i)
if(sqrt(pow(x-enemy[i].x,2)+pow(y-enemy[i].y,2))<=minr)
++cnt;
return cnt;
}
inline void SA()
{
int temp=1e5;
while(temp>1e-15)
{
int nx=ansx+(rand()<<1-RAND_MAX)*temp;
int ny=ansy+(rand()<<1-RAND_MAX)*temp;
int nw=kill(nx,ny);
//cout<<nw<<endl;
int delta=nw-ans;
if(delta>0)
{
ansx=nx;
ansy=ny;
ans=nw;
}
else if(exp(-delta/temp)*RAND_MAX<rand())
{
ansx=nx;
ansy=ny;//注意此处并没有更新ans
}
temp*=cool;
}
}
signed main(void)
{
ios::sync_with_stdio(false);
srand((unsigned long)time(0));
cin>>n>>m>>r;
for(re i=1;i<=n;++i)
cin>>builds[i].x>>builds[i].y>>builds[i].r;
for(re i=1;i<=m;++i)
{
cin>>enemy[i].x>>enemy[i].y;
ansx+=enemy[i].x;
ansy+=enemy[i].y;
}
ansx/=n;
ansy/=n;
ans=kill(ansx,ansy);
while(clock()<950)SA();
cout<<ans<<'\n';
return 0;
}
求dalao指明错误