• ural(Timus) 1333. Genie Bomber 2


    几何题

    题意:给出n个圆的圆心坐标和半径,给出一个单位方格,在(0,0),(0,1),问这些圆覆盖的面积占方格的百分比,圆超出方格的部分不计算。另外算百分比,答案精确到1%即可,即整数部分正确即可,小数部分不要求

    这题,可以想按照题意直接下手,未免太难了,另外注意到答案的输出,其实对精度的要求很低(对小数都没要求)。我们可以用一直近似的算法来解决

    将方格分割为一个一个的小格子,当分割得很小的时候,格子可以看做是一个点,然后看这个点在不在圆上或圆内,在的话相当于圆覆盖了这个点,覆盖了这个格子。所以我们将1*1方格分割为1000*1000的格子,然后逐一去判断,很暴力的方法,但就是这样过了

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    const double PI = acos(-1.0);
    const double E = 1e-8;
    const int N = 15;
    const int M = 1000;
    const double B = 0.001;
    struct crc
    {
        double x,y,r;
    }a[N];
    int n;
    
    double dis(double x ,double y , struct crc p)
    {
        return sqrt( (x-p.x)*(x-p.x) + (y-p.y)*(y-p.y));
    }
    
    int judge(double x , double y)
    {
        for(int i=0; i<n; i++)
        {
            double d = dis(x,y,a[i]);
            if( d < a[i].r || fabs(d - a[i].r) < E)
                return 1;
        }
        return 0;
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int res = 0;
            for(int i=0; i<n; i++)
                scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].r);
            for(int i=0; i<=M; i++)
                for(int j=0; j<=M; j++)
                {
                    double x = B * 1. * i;
                    double y = B * 1. * j;
                    int ok = judge(x,y);
                    res += ok;
                }
            printf("%.6lf\n",1.*res/(1.*M*M)*100.0);
        }
        return 0;
    }
  • 相关阅读:
    Java 实例
    为什么很多程序员工作时都戴耳机?
    HTTP状态码大全
    Eclipse怎么切换工作空间
    maven POM.xml内的标签大全详解
    利用html5的FormData对象实现多图上传
    后台定时器注解方式
    js多定时器
    解决ios上微信无法捕获返回键按钮事件的问题
    上传文件,获取表单数据和文件流
  • 原文地址:https://www.cnblogs.com/scau20110726/p/3060330.html
Copyright © 2020-2023  润新知