[VP]河南第十三届ICPC大学生程序竞赛 L.手动计算

文章介绍了如何使用蒙特卡洛积分方法求解两个椭圆并集的面积之和。通过在[0,1]区间上进行随机抽样,计算点落在椭圆内的比例来估算面积,以达到一定的精度。代码示例中展示了双层循环遍历坐标并判断点是否在椭圆内的过程,最终得到面积之比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

传送门 :

题意 :
给定两个椭圆 的方程 , 要求 求出椭圆并集的面积之和

思路 :
本题很显然是积分 或者 计算几何的问题

对于积分的做法, 无非就是根据积分公式求出第一象限的面积 之后拓展到后面四个象限。(奈何我懒, 连两个椭圆的焦点都不想求更别提后面的积分公式了)

官方题解用的是蒙特卡洛积分的方法 , 这个方法的证明就是大数定理

在这里插入图片描述
根据这几个公式的推导 , 那么我们可以知道 定积分形式的内容就可以转变为 1 N ∑ f ( x ) p ( x ) \frac{1}{N}\sum\frac{f(x)}{p(x)} N1p(x)f(x) 的形式 , 即最后变成了面积的比

那么这个公式的精度如何 , 下面是 y = f ( x ) y=f(x) y=f(x) [ 0 , 1 ] [0,1] [0,1]区间上面的分布 因此我们可以认为在 1 0 5 10^5 105的级别精度是可行的

在这里插入图片描述
code :

double a1,b1,a2,b2;
double cnt ;

void solve(){
	cnt = 0 ;
	
	cin>>a1>>b1>>a2>>b2;
	for(double i =  -8; i <= 8 ; i += 0.01){
		for(double j = -8 ; j <= 8 ;j += 0.01){
			if(i*i/a1/a1 + j*j/b1/b1 <=1 || i*i/a2/a2 + j*j/b2/b2 <= 1){
						cnt ++ ;	
			}
		}
	}
	
	cnt = (cnt*16*16/(1600*1600));//面积之比
	printf("%.1f\n" , cnt);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值