CodeForce 814D 贪心

可以发现规律,如果一个圆被内含或内切(也就是说,这个圆是小圆,被一个大圆内含或内切)的次数是奇数次,那么答案ans需要加上这个圆的面积,else答案ans需要减去这个圆的面积。然后照着这个思想写下去就好了。

注意结尾的时候控制8位小数的精度,precision自动四舍五入。

#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const double EPS = 1e-9;
const int maxv = 1010;

int visit[maxv];
struct Node {
    double x, y, r;
} node[maxv];

bool solve(int i, int j) {
    double dist_square = pow(node[i].x - node[j].x, 2.0) + pow(node[i].y - node[j].y, 2.0);
    double R_plus_r_square = pow(node[i].r - node[j].r, 2.0);
    if (dist_square - R_plus_r_square <=EPS && node[i].r > node[j].r)//两圆内切加内含的条件为d<=(R+r)
        return true;
    return false;
}

int main(void) {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> node[i].x >> node[i].y >> node[i].r;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            if (i == j)
                continue;
            if (solve(i, j)) //判断j是不是小圆且被i内含
                visit[j]++;
        }
    double ans = 0.0;
    for (int i = 1; i <= n; i++) {
        if (visit[i] == 0 || visit[i] % 2 == 1)
            ans += PI * pow(node[i].r, 2.0);
        else
            ans -= PI * pow(node[i].r, 2.0);
    }
    cout << fixed << setprecision(8) << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81455927