只有36分求解答
  • 板块P3844 [TJOI2007] 圆
  • 楼主xmbc
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/11 18:36
  • 上次更新2024/1/11 21:36:49
查看原帖
只有36分求解答
1139105
xmbc楼主2024/1/11 18:36

基本思路: 按半径降序排列,保证后边的圆如果与前边的圆重叠则后边圆所在区域全变了颜色。如果前边的圆覆盖了此区域的是奇数个那就是这里白色,画上后变黑。如果是偶数个此位置就是黑色,加上后变白。只需要看个数就行了。但是只有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;
}
2024/1/11 18:36
加载中...