基本思路: 按半径降序排列,保证后边的圆如果与前边的圆重叠则后边圆所在区域全变了颜色。如果前边的圆覆盖了此区域的是奇数个那就是这里白色,画上后变黑。如果是偶数个此位置就是黑色,加上后变白。只需要看个数就行了。但是只有36分,后边测试数据全错,大家帮看一下错哪里了
#include<cstdio>
#include<cmath>
using namespace std;
struct cir
{
int x,y,r;
};
int cmp(cir a,cir b)//如果相离返回0,如果a含b返回1,如果b含a返回-1
{
double s;
s=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
if(s>=a.r+b.r)
return 0;
if(a.r>b.r)
return 1;
return -1;
}
double sa(cir x)
{
return 3.1415926*x.r*x.r;
}
int main()
{
int n,i,j,x;
double s=0;
scanf("%d",&n);
cir a[n],t;
bool y;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&(a[i].x),&(a[i].y),&(a[i].r));
for(j=i;j>0 && a[j].r>a[j-1].r;j--)
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
for(i=0;i<n;i++)
{
y=true;
for(j=0;j<i;j++)
if(cmp(a[i],a[j]))
y=!y;
if(y)
s+=sa(a[i]);
else
s-=sa(a[i]);
}
printf("%.2lf",s);
return 0;
}