UVA 11722 Joining with Friend 图形面积+概率

本文探讨了如何通过几何方法计算矩阵中被特定直线分割的非阴影面积比例,详细解析了矩阵边界条件下的面积计算逻辑,并通过实例演示了解决类似问题的步骤。
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
    int T,tt=0;
    scanf("%d",&T);
    while(T--)
    {
        int a[10],t1,t2,s1,s2,w,i,j,k,p,x,y;
        double s=0,sum;//s记录非阴影面积
        scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w);
        a[0]=s1-t2;
        a[1]=s2-t2;
        a[2]=s1-t1;
        a[3]=s2-t1;
        sort(a,a+4);
        sum=(t2-t1)*(s2-s1);
        p=min(s2-s1,t2-t1);
        if(-w<=a[0])
            s+=0;
        else if(-w<=a[1])
        {
            x=t2-s1-w;
            y=t2-s1-w;
            s+=0.5*x*y;
        }
        else if(-w<=a[2])
        {
            s+=0.5*p*p;
            x=-w-a[1];
            s+=x*p;
        }
        else if(-w<=a[3])
        {
            x=s2+w-t1;
            y=s2+w-t1;
            s+=(t2-t1)*(s2-s1)-0.5*x*y;
        }
        else
            s+=(t2-t1)*(s2-s1);
        //printf("%.6lf\n",s);
        //
        if(w>=a[3])
            s+=0;
        else if(w>=a[2])
        {
            x=s2-w-t1;
            y=s2-w-t1;
            s+=0.5*x*y;

        }
        else if(w>=a[1])
        {
            s+=0.5*p*p;
            x=a[2]-w;
            s+=x*p;
        }
        else if(w>=a[0])
        {
            x=t2-s1+w;
            y=t2-s1+w;
            s+=(t2-t1)*(s2-s1)-0.5*x*y;
        }
        else
            s+=(t2-t1)*(s2-s1);
       // printf("%.6lf %.6lf\n",sum,s);
        printf("Case #%d: %.8lf\n",++tt,(sum-s)/sum);
    }
    return 0;
}
/*
    以坐标(t1,s1),(t2,s2)作边平行于坐标轴的矩阵,再作直线y=x+w和y=x-w,它们之间与矩阵相覆盖的阴影面积占矩阵总面积比就是答案
    
    方法:
        过4个矩阵顶点作平行于y=x的直线,共分5个区域。分别根据w讨论y=x+w和y=x-w在哪个区域内,再计算非阴影面积,之后总面积减
    非阴影面积再除以总面积就可得到答案
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值