1. 油滴扩展( box)
【问题描述】
在一个长方形框子里,最多有N(O≤N≤6)个相异的点。在其中任何~个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)
注:圆的面积公式V=pi*r*r,其中r为圆的半径。
【输入】
第一行一个整数N。
第二行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。
接下去N行,每行两个整数XI,yi,表示盒子内N个点的坐标。
以上所有的整数都在[-1000,1000]内。
【输出】
一行,一个整数,长方形盒子剩余的最小空间(结果四舍五人输出)。
【输入样例】
2
0 0 10 10
3 3
7 7
【输出样例】
50
提交次数4
1、WA10,很傻比的,没有考虑x,y,x`,y`究竟是左上还是右下,因此被坑了。
2、WA10,
3、WA40,很傻比的,用了四个名字很像的数组,x,X,y,Y,于是把它们混淆了。
4、AC
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
double x[10],y[10],X[10],Y[10],r[10];
double a,b,c,d;
bool used[10];
double ans = 0;
long n;
const double pi = 3.1415926535897932384626433832795;
long getint()
{
long rs=0;char tmp;bool sgn=1;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){sgn=0;tmp=getchar();}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
void dfs(long l,double s)
{
if (l == n+1)
{
ans = MAX(ans,s);
return;
}
for (long i=1;i<n+1;i++)
{
if (!used[i])
{
used[i] = true;
x[l] = X[i];
y[l] = Y[i];
r[l] = MIN(MIN(X[i]-a,c-X[i]),MIN(Y[i]-b,d-Y[i]));
for (long j=1;j<l;j++)
{
r[l] = MIN(r[l],sqrt((x[j]-X[i])*(x[j]-X[i])+(y[j]-Y[i])*(y[j]-Y[i]))-r[j]);
if (r[l] <= 0)
{
r[l] = 0;
break;
}
}
dfs(l+1,s+pi*r[l]*r[l]);
used[i] = false;
}
}
}
int main()
{
freopen("box.in","r",stdin);
freopen("box.out","w",stdout);
n = getint();
a = getint();
b = getint();
c = getint();
d = getint();
if (c < a)
{
double tmp = c;
c = a;
a = tmp;
}
if (d < b)
{
double tmp = d;
d = b;
b = tmp;
}
for (long i=1;i<n+1;i++)
{
X[i] = getint();
Y[i] = getint();
}
dfs(1,0);
printf("%.0lf",(c-a)*(d-b)-ans);
return 0;
}