#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分,代码在与题解的对比中不断杂糅,救救孩子吧