QAQ N比较小,直接DFS爆搜就行了 注意一个小细节:那就是算r的时候如果油滴被包含了,算出来的是个负数,但其实R是0,特判一下即可AC
#include <cstdio> #include <stdlib.h> #include <iostream> #include <cstring> #include <cmath> #define PI 3.1415926 using namespace std; struct tw{ int x,y; }a[10]; double dis[10][10]; int n; bool f[10]; int x,y,x2,y2; double ans,r[10]; double sum; double minx(double a,double b,double c,double d) { double num=min(a,b); num=min(num,c); num=min(num,d); return num; } bool check() { for(int i=1;i<=n;i++) if(!f[i]) return 0; return 1; } void dfs() { if(check()) { ans=max(ans,sum); return; } for(int i=1;i<=n;i++) if(!f[i]) { double minn=minx(abs(a[i].x-x),abs(a[i].x-x2),abs(a[i].y-y),abs(a[i].y-y2)); for(int j=1;j<=n;j++) if(f[j]&&i!=j) minn=min(minn,dis[i][j]-r[j]); if(minn<0) minn=0; f[i]=1; r[i]=minn; sum+=minn*minn; dfs(); sum-=minn*minn; f[i]=0; r[i]=0; } } int main() { scanf("%d",&n); scanf("%d%d%d%d",&x,&y,&x2,&y2); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) dis[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)); dfs(); double ans1=abs(x-x2)*abs(y-y2); ans1-=ans*PI; ans1+=0.5; printf("%d",(int) ans1); return 0; }