类似积分

题目:给你三种图形,圆心在x轴上的圆,中心在x轴上且边与x轴平行的正方形,中心在x轴上且边与x轴成45度的正方形。三种图形的边长、半径都是<=10的非负数。且中心坐标是绝对值<=10的整数。给你n个图形(n<=10),问你共覆盖了多少面积,精确到整数位
思路:这题比赛时没多想,其实抓住答案的精度非常粗略且图形很少,范围很小就比较好做了。用积分的思想,x从-20递增到20,每次增长0.001,对于特定的x,枚举所有图形,找到最大的y,y*0.001就是这个小矩形区域的面积,累加*2即可。

#include<stdio.h>
#include<string.h>
#include<math.h>
inline double max(double a,double b){return a>b?a:b;}
int n;
typedef struct Node{
    int type;
    double x,d;
}Node;
Node node[12];
double cal(double x)
{
    int i;
    double y=0;
    for(i=1;i<=n;i++)
    {
        int type=node[i].type;
        double c=node[i].x,d=node[i].d;
        if(type==1)
        {
            if(c-d/2<=x && x<=c+d/2) y=max(y,d/2);
        }
        if(type==2)
        {
            double x1=c-d/sqrt(2.0),x2=c+d/sqrt(2.0);
            if(x1<x && x<=c) y=max(y,x-x1);
            if(c<x && x<=x2) y=max(y,x2-x);
        }
        if(type==3)
        {
            if(c-d<=x && x<=c+d) y=max(y,sqrt(d*d-(x-c)*(x-c)));
        }
    }
    return y;

}
int main()
{
    int i,j;
    int t;
    scanf("%d",&t);
    while(t–)
    {
        scanf("%d",&n);
        char com[5];
        for(i=1;i<=n;i++)
        {
            scanf("%s%lf%lf",com,&node[i].x,&node[i].d);
            node[i].type=com[0]-’A'+1;
        }
        double ans=0;
        for(double x=-20;x<20;x+=0.001) ans+=0.001*cal(x);
        printf("%.0f\n",ans*2);


    }
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>