N<=6,那我必须立即开始暴搜
错点:相减的精度不够,用3.14一开始没过,3.1415926就过了
老错误了,double型数据科学计数法,因此最后要转化为int数据
附上代码:
#include<bits/stdc++.h>
using namespace std;
int n,xs,ys,xe,ye;
int up,dn,lt,rt;
int x[10],y[10];
bool b[10];
double ans=-1;
double user[10];
int num[10];
double find(int before,int pos)
{
double ansr;
ansr=min(up-y[pos],y[pos]-dn);
ansr=min(ansr,double(x[pos]-lt));
ansr=min(ansr,double(rt-x[pos]));
for(int i=1;i<=before;i++)
{
double dist=(x[num[i]]-x[pos])*(x[num[i]]-x[pos])+(y[num[i]]-y[pos])*(y[num[i]]-y[pos]);
dist=sqrt(dist)-user[num[i]];
ansr=min(ansr,dist);
}
if(ansr<0) ansr=0;
return ansr;
}
void search(int x,double cnt)
{
if(x==n+1)
{
ans=max(ans,cnt);
return;
}
else
{
for(int i=1;i<=n;i++)
{
if(b[i])
{
b[i]=false;
double r=find(x-1,i);
double mian=3.1415926*r*r;
user[i]=r;
num[x]=i;
search(x+1,cnt+mian);
b[i]=true;
user[i]=0;
num[x]=0;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
memset(b,1,sizeof(b));
cin>>n;
cin>>xs>>ys>>xe>>ye;
up=max(ys,ye),dn=min(ys,ye);
lt=min(xs,xe),rt=max(xs,xe);
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
search(1,0);
cout<<int(round((double)(up-dn)*(rt-lt)-ans));
return 0;
}