搜下去
半径为负的时候置0
调了好长时间
因为该置初始值的时候想错了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define MOD 1000000007
#define LL long long
#define pi 3.141592653589
using namespace std;
int x[10],y[10],n,f[10];
double xx1,yy1,xx2,yy2,ans,tot,dis[10][10],r[10],dism[10];
double ABS(double t)
{
if(t<0.0) return -t;
return t;
}
double minx(double a,double b,double c,double d)
{
a=min(a,b);
a=min(a,c);
a=min(a,d);
return a;
}
double randfalse(int t)
{
int i;
double tmp,dis;
tmp=dism[t];
for(i=1;i<=n;i++)
if(i!=t&&f[i]==1)
{
dis=sqrt((x[i]-x[t])*(x[i]-x[t])+(y[i]-y[t])*(y[i]-y[t]));
tmp=min(tmp,max(dis-r[i],0.0));
}
return tmp;
}
void dfs(int t,double s)
{
int i;
double sum;
if(t==n+1)
{
ans=max(ans,s);
return;
}
for(i=1;i<=n;i++)
if(!f[i])
{
r[i]=randfalse(i);
f[i]=1;
sum=s+pi*r[i]*r[i];
dfs(t+1,sum);
f[i]=0;
}
}
int main()
{
int i,j,rans;
scanf("%d",&n);
scanf("%lf%lf%lf%lf",&xx1,&yy1,&xx2,&yy2);
tot=ABS(xx1-xx2)*ABS(yy1-yy2);
if(n==0)
{
rans=tot+0.5;
printf("%d",rans);
return 0;
}
for(i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
dism[i]=minx(ABS(xx1-x[i]),ABS(xx2-x[i]),ABS(yy1-y[i]),ABS(yy2-y[i]));
}
dfs(1,0.0);
rans=tot-ans+0.5;
printf("%d",rans);
return 0;
}