搜索……
PS一个坑点:r<=0时并不是舍弃这种情况,而是让r=0
(因为每个点都要放一滴油)(读题啊!)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #define dd double 5 using namespace std; 6 const int N=15; 7 const dd pai=3.1415926535,INF=100000000; 8 int flag[N],n; 9 dd xx,yy,x2,y2,x[N],y[N]; 10 //'int y1' redeclared as different kind of symbol,保留字 11 dd dx[N][5],dy[N][5],dis[N][N],r[N],ans; 12 void swap(dd &a,dd &b){ 13 dd tmp=a; 14 a=b; 15 b=tmp; 16 } 17 dd min(dd a,dd b){ 18 return a<b?a:b; 19 } 20 dd max(dd a,dd b){ 21 return a>b?a:b; 22 } 23 void dfs(int step,dd size){ 24 if (step==n){ 25 ans=max(ans,size); 26 return; 27 } 28 for (int i=1;i<=n;i++){ 29 if (!flag[i]){ 30 dd len=min(dx[i][1],dx[i][2]); 31 len=min(len,min(dy[i][1],dy[i][2])); 32 for (int j=1;j<=n;j++) 33 if (flag[j]){ 34 dd l=dis[i][j]-r[j]; 35 if (l>0) 36 len=min(len,l); 37 else 38 len=0;//*** 39 } 40 flag[i]=1; 41 r[i]=len; 42 size+=pai*r[i]*r[i]; 43 dfs(step+1,size); 44 flag[i]=0; 45 size-=pai*r[i]*r[i]; 46 } 47 } 48 } 49 int main(){ 50 scanf("%d",&n); 51 scanf("%lf %lf %lf %lf",&xx,&yy,&x2,&y2); 52 for (int i=1;i<=n;i++) 53 scanf("%lf %lf",&x[i],&y[i]); 54 if (xx>x2) 55 swap(xx,x2); 56 if (yy>y2) 57 swap(yy,y2); 58 for (int i=1;i<=n;i++){ 59 dx[i][1]=x2-x[i]; 60 dx[i][2]=x[i]-xx; 61 dy[i][1]=y2-y[i]; 62 dy[i][2]=y[i]-yy; 63 for (int j=1;j<=n;j++){ 64 int cx=x[i]-x[j]; 65 int cy=y[i]-y[j]; 66 dis[i][j]=sqrt(cx*cx+cy*cy); 67 } 68 } 69 ans=0; 70 dfs(0,0); 71 dd s=(x2-xx)*(y2-yy)-ans; 72 int S=s+0.5; 73 printf("%d",S); 74 return 0; 75 }