【题目】http://codeforces.com/problemset/problem/814/D
【题意】给一堆圆,这些圆不会相交,现在将他们分成两组,被两个圆覆盖的地方会变成空白,面积不计入在内,求最大面积。
【思路】记录每个圆被覆盖的次数,没有被覆盖过的圆肯定能取,被覆盖一次的圆可以分到另一组,也能计入总面积,但覆盖2次的圆只能留在图上挖洞(不论在哪一组),然后被覆盖3次的又可以在覆盖2次留下的空白处增加面积……所以,总面积就是覆盖0次圆的面积+覆盖奇数次-覆盖偶数次圆的面积。
【代码】
#include<cstdio>
#include<cmath>
const int M=1005;
double pi=acos(-1);
double x[M],y[M],r[M];
int level[M]= {0};
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j)
continue;
if(sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))<=r[j]-r[i])
level[i]++;
}
}
double ans=0;
for(int i=0; i<n; i++)
{
if(level[i]==0)
ans+=pi*r[i]*r[i];
else if(level[i]%2==1)
ans+=pi*r[i]*r[i];
else
ans-=pi*r[i]*r[i];
}
printf("%.10f\n",ans);
}