题目链接:L-手动计算_河南省第十三届ICPC大学生程序设计竞赛(重现赛)(重现赛)@YanPei (nowcoder.com)
一个很微妙的方法,撒点...
我们选定一个矩形框住两个椭圆,在矩形内均匀撒点,假设一共撒了K个点,有F个点落在了椭圆内,矩形的面积为S,那么我们可以近似认为两个椭圆的并的面积为F/K*S.
撒的点尽量多使F尽量大,那么越接近正确答案,此题要求保留一位小数,这里每隔0.01设置一个点就可以通过此题了
判断点是否在椭圆内根据椭圆的定义来判断.
AC代码:
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
double a,b,c,d;
cin>>a>>b>>c>>d;
int ans=0;
for(double i=-8;i<=8;i+=0.01)
{
for(double j=-8;j<=8;j+=0.01)
{
double s1=i*i/a/a+j*j/b/b;
double s2=i*i/c/c+j*j/d/d;
if(s1<=1||s2<=1) ans++;
}
}
printf("%.1lf\n",(double)ans/1600/1600*16*16);
}
return 0;
}