Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque 贪心

来源:互联网 发布:香港广华街枪店淘宝 编辑:程序博客网 时间:2024/06/07 10:53

题目链接: 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;}
阅读全文
0 0
原创粉丝点击