拿到题目没头绪,然后看到n<=6,就把这题变成了暴搜题。
枚举每个地方是不是可能放油滴。
油滴半径不能小于0呀。。
π的精确度得高一点,否则会被卡分。
#include<iostream>
#include<cmath>
using namespace std;
const float pi=3.1415926535;
int n,a1,b1,a2,b2,num,ans=100000000,beg;
long int s;
struct node
{
int x;
int y;//center of the circle
float r;//radious;
int flag;
}circle[7],que[7];
float ans2;
float dis(node x, node y)
{
float ans3;
ans3=sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
return ans3;
}
void make()
{
int i,j;
float min1=10001;
if(num==n)
{
ans2=0;
for(i=1; i<=n; i++)
ans2+=pi*que[i].r*que[i].r;
ans2=s-ans2;
beg=(int)(ans2+0.5);
if(beg<ans)
ans=beg;
return;//到此是枚举完了判断符不符合题意
}
for(i=1; i<=n; i++)
if(circle[i].flag==false)
{
min1=10001;
circle[i].flag=true;
if(abs(circle[i].x-min(a1,a2))<min1)
min1=abs(circle[i].x-min(a1,a2));
if(abs(circle[i].x-max(a1,a2))<min1)
min1=abs(circle[i].x-max(a1,a2));
if(abs(circle[i].y-min(b1,b2))<min1)
min1=abs(circle[i].y-min(b1,b2));
if(abs(circle[i].y-max(b1,b2))<min1)
min1=abs(circle[i].y-max(b1,b2));
for(j=1; j<=num; j++)
if(dis(circle[i],que[j])-que[j].r<min1)
min1=dis(circle[i],que[j])-que[j].r;
if(min1<0)
min1=0;//到此是求半径
circle[i].r=min1;
num++;
que[num]=circle[i];
make();
num--;
circle[i].r=0;
circle[i].flag=false;
}
return;
}
void read()
{
int i;
cin>>n>>a1>>b1>>a2>>b2;
for(i=1; i<=n; i++)
{
cin>>circle[i].x>>circle[i].y;
circle[i].r=0;
circle[i].flag=false;
}
s=abs(a2-a1)*abs(b2-b1);
make();
cout<<ans<<endl;
return;
}
int main()
{
read();
return 0;
}
AC代码。