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

题目链接: 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值