timus 1333. Genie Bomber 2 URAL 结题报告 多圆覆盖率问题
题目大意,求轰炸机轰炸率问题,因为轰炸机的炸弹轰炸面积是圆形,而测试地区的形状是正方形,给多个炸弹和轰炸半径,其被轰炸的面积占测试面积的百分比;
而且精确到1%或者更好一也可以…… 初一看这个题,也忒难了吧,多个圆,还有可能多圆并…… 娘的,难度才200+啊,计算几何也忒难了吧,搜解题报告,看到精度不是太卡,把正方形的面积离散化就可以了,离散化成矩阵网格或者是点阵都可以,随你怎么离散化,然后判断点是不是在圆内…… 题目就这么轻轻松松的 A了,貌似我连测试数据都没过啊
#include <iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const double INF = 1e20;
const double EPS=1e-6;
bool dd(double x,double y) { return fabs( x - y ) < EPS;} // x == y
bool xyd(double x,double y) { return x<y+EPS;} // x <= y
struct Node
{
double x,y;
double r;
int id;
};
double getk(double x1,double y1,double x2,double y2)
{
if(dd(x1,x2))return INF;
else return (y2-y1)/(x2-x1);
}
double dis2(Node n1,Node n2)
{
return sqrt( pow(n1.x-n2.x, 2.0 )+pow(n1.y-n2.y, 2.0 ) );
}
int main()
{///方法er,优化法,因为O(N^3)要有好多次重复的计算,好多次比较斜率的时候实际上是把两点的斜率重新计算了下,
///所以先把i,j的斜率算出来,在做处理
int n, num;
cin>>n;
Node nod[20];
for (int i=0; i<n; i++)
cin>>nod[i].x>>nod[i].y>>nod[i].r;
int ans=0;
for (double i=0; i<1; i+=0.001)
{///精度太差了吧,连样例都没过啊
for(double j=0;j<1;j+=0.001)
{
Node tmp;tmp.x=i;tmp.y=j;
for(int t=0;t<n;++t)
{
if( xyd(dis2(tmp,nod[t]),nod[t].r) ){ans++; break;}
}
}
}
double tmp=(ans*100)/(1000.0*1000.0);
printf("%.5f\n",tmp+EPS);
}