题目链接: An overnight dance in discotheque
题目大意
n个圆, 他们相互之间相切相离包含, 但不会相交一幅图的总面积等于图中阴影面积
就是被包含偶数次的圆内为阴影, 被包含奇数次的圆为空白
求将一个这幅图分成两幅, 如上面两张图, 问最大阴影面积是多少
思路
最优方法: 把所有没有被包含过的圆放在第一幅图, 其他圆放在第二幅图
可以将第二幅图任何圆移到第一幅图上, 你会发现无论哪种情况, 总面积都变小或不变(相对于最优方法)
代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000;
const double pi = acos(-1.0);
struct P
{
double x, y, r;
int times;
bool operator<(const P & b) const{ return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y) < (r+b.r)*(r+b.r) && r < b.r; }//a<b a被b包含
}p[MAXN];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; ++i) p[i].times = 0, cin >> p[i].x >> p[i].y >> p[i].r;
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
if(i!=j && p[i]<p[j]) p[i].times++;
double ans = 0;
for(int i=0; i<n; ++i)
if(p[i].times == 0 || p[i].times%2 == 1) ans += p[i].r*p[i].r*pi;
else ans -= p[i].r*p[i].r*pi;
printf("%.10f\n", ans);
return 0;
}