我是靠谱客的博主 矮小裙子,最近开发中收集的这篇文章主要介绍Codeforces 814D,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意略。

思路:

由于不重合这个性质,我们可以将每一个堆叠的圆圈单独拿出来考虑,而不用去考虑其他并列在同一层的存在,

在贪心解法下,发现,被嵌套了偶数层的圆圈永远是要被减去的,而奇数层的圆圈是要加上的。

                                                                               

 

详见代码:

#include<bits/stdc++.h>
#define maxn 1005
#define eps 1e-8
#define pi acos(-1.0)
using namespace std;
struct Circle{
double x,y,r;
Circle(double a = 0,double b = 0,double c = 0){
x = a,y = b,r = c;
}
double area(){
return r * r * pi;
}
};
Circle store[maxn];
int mark[maxn];
int n;
double dist(int c1,int c2){
double x1 = store[c1].x,y1 = store[c1].y;
double x2 = store[c2].x,y2 = store[c2].y;
double dx = x1 - x2,dy = y1 - y2;
return sqrt(dx * dx + dy * dy);
}
int sgn(double x,double y){
if(fabs(x - y) < eps) return 0;
else if(x > y + eps) return 1;
else return -1;
}
bool in(int x,int y){
double r = fabs(store[x].r - store[y].r);
double d = dist(x,y);
if(sgn(d,r) <= 0) return true;
return false;
}
bool cmp(const Circle& c1,const Circle& c2){
return c1.r > c2.r;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;++i){
scanf("%lf%lf%lf",&store[i].x,&store[i].y,&store[i].r);
}
sort(store,store + n,cmp);
for(int i = 0;i < n;++i){
int cnt = 0;
for(int j = 0;j < i;++j){
if(in(i,j)) ++cnt;
}
mark[i] = cnt;
}
double ans = 0;
for(int i = 0;i < n;++i){
if(mark[i] == 0) ans += store[i].area();
else if(mark[i] & 1) ans += store[i].area();
else ans -= store[i].area();
}
printf("%.9lfn",ans);
return 0;
}

 

转载于:https://www.cnblogs.com/tiberius/p/9287848.html

最后

以上就是矮小裙子为你收集整理的Codeforces 814D的全部内容,希望文章能够帮你解决Codeforces 814D所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部