415. 学姐的学弟
时间限制 1000 ms 内存限制 65536
KB
题目描述
学姐正在写作业,但是她写着写着就开始想学弟,走神的她就开始在纸上画圈圈。这时学弟突然出现了,好奇的学弟问学姐在做什么,惊慌之下,学姐随口说想算一下这些圆覆盖的面积为多少。学弟顿时非常仰慕学姐,但是学姐突然意识到自己不会做,为了自己能给学弟留下好印象,她来求助你帮她算出来这些圆覆盖的面积。
为了简化问题,我们假设所有圆的半径都为1。
输入格式
输入有多组数据。开头为一个整数T(T≤10),表示数据组数,接下来T组输入,每组开头为一个整数n(1≤n≤100),表示学姐画的圆的个数,接下来n行,每行两个整数xi,yi,表示圆的圆心坐标,1≤xi,yi≤100。
输出格式
输出一个数,表示面积并,精确到小数点后五位。
输入样例
1
2
1 1
2 1
输出样例
5.05482
注意!:题中xi,yi为整数点,每个1*1的正方形覆盖情况有限,所以记录这些方块,分别计算面积再叠加。方法很巧妙。
PI/4PI/6+sqrt(3)/4
1
代码:#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define PI 3.141592653 using namespace std; int main() { int t,n,x,y,maxx,maxy,vis[110][110],a; double sum; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); maxx=0;maxy=0; sum=0; scanf("%d",&n); while(n--) { scanf("%d %d",&x,&y); vis[x][y]=1; maxx=max(x,maxx); maxy=max(y,maxy); } for(int i=0;i<=maxx+1;i++) { for(int j=0;j<=maxy+1;j++) { a=vis[i][j]+vis[i][j+1]+vis[i+1][j]+vis[i+1][j+1]; if(a==1) sum+=PI/4; else if(a==2) { if(vis[i][j]+vis[i+1][j+1]==2||vis[i+1][j]+vis[i][j+1]==2) sum+=1; else sum+=PI/6+sqrt(3)/4; } else if(a>=3) sum+=1; } } printf("%.5lf\n",sum); } return 0; }