boj415.学姐的学弟。。。(巧解题)
原题大致意思是这样的:
学姐正在写作业,但是她写着写着就开始想学弟,走神的她就开始在纸上画圈圈。这时学弟突然出现了,好奇的学弟问学姐在做什么,惊慌之下,学姐随口说想算一下这些圆覆盖的面积为多少。学弟顿时非常仰慕学姐,但是学姐突然意识到自己不会做,为了自己能给学弟留下好印象,她来求助你帮她算出来这些圆覆盖的面积。
为了简化问题,我们假设所有圆的半径都为1。
输入格式
输入有多组数据。开头为一个整数 T(T≤10) ,表示数据组数,接下来T组输入,每组开头为一个整数 n(1≤n≤100) ,表示学姐画的圆的个数,接下来 n 行,每行两个整数 xi,yi ,表示圆的圆心坐标, 1≤xi,yi≤100 。
输出格式
输出一个数,表示面积并,精确到小数点后五位。
输入样例
1
2
1 1
2 1
输出样例
5.05482
做的时候,我主要发现以下几点需要pay attention——
1. 有一些数需要重复使用,初始化和归位思想一定要牢记在心,我为此wa了好几遍。以后你可以在输出前后都把变量输出一遍来检查。
2. 在常数的定义上我们需要小心。这道题目需要引用π,c++中有个很好的做法
#include<math.h>
const double PI=acos(-1.0);
不过在c文件中会给出警告,所以我就直接这么用了
#define PI 3.14159265/const double PI=3.141592653;
也不是不可以,不过上面那个更准。如果你够那啥,可以用逼近公式算哦
#include
#include
#include
#include
int xy[105][105];
int main()
{
const double PI=3.141592653;
//freopen("test.txt","r",stdin);
int t,n;
int xi,yi;
int i,j;
double s=0;
int xmax=0,ymax=0,xmin=-1,ymin=-1;
int count1,count2,count3,count4;
scanf("%d",&t);
while(t--){
memset(xy,0,sizeof(xy));
scanf("%d",&n);
while(n--){
scanf("%d %d",&xi,&yi);
xy[xi][yi]=1;
if(xmin==-1)xmin=xi-1;
xmin=((xi-1)
xmax)?xi+1:xmax; ymax=((yi+1)>ymax)?yi+1:ymax; } for(i=xmin;i