2021牛客暑期多校训练营2 F-Girlfriend

传送门

题目大意

在这里插入图片描述

题解

数学题
真的是数学题

以下为思路

一维中,交集是区间和

黑线为数轴,黄色区域是红色区域和蓝色区域的集合

因为一维过于简单,题目的思路就不放了

二维
题目意思可理解为有两点A、B,动点P在二维坐标系中运动,使得 P A P B = K \frac{PA}{PB}=K PBPA=K
在这里插入图片描述

因为二维证明用小学二年级 数学知识易证,不再累述

那么
三维
.
.
.
.
.
.
.
.
.
.
.
.
.
.

三维画不出来哈哈哈

那么,
代数证明!

给出4个点
A ( x 0 , y 0 , z 0 ) , B ( x 1 , y 1 , z 1 ) , C ( x 2 , y 2 , z 2 ) , D ( x 3 , y 3 , z 3 ) A(x_0,y_0,z_0),B(x_1,y_1,z_1),C(x_2,y_2,z_2),D(x_3,y_3,z_3) A(x0,y0,z0),B(x1,y1,z1),C(x2,y2,z2),D(x3,y3,z3)
以A,B,P1为例,设P1(x,y,z),依据题目限制条件先写出关系式

( x − x 0 ) 2 + ( y − y 0 ) 2 + ( z − z 0 ) 2 = k 1 ∗ k 1 ∗ [ ( x − x 1 ) 2 + ( y − y 1 ) 2 + ( z − z 1 ) 2 ] (x−x_0)^2+(y−y_0)^2+(z−z_0)^2=k1∗k1∗[(x−x_1)^2+(y−y_1)^2+(z−z_1)^2] (xx0)2+(yy0)2+(zz0)2=k1k1[(xx1)2+(yy1)2+(zz1)2]
化简得
( k 1 2 − 1 ) ( x 2 + y 2 + z 2 ) − ( 2 k 1 2 x 1 ​ − 2 x 0 ) x − ( 2 k 1 2 y 1 − 2 y 0 ) y − ( 2 k 1 2 z 1 − 2 z 0 ) z + k 1 2 ( x 1 2 + y 1 2 + z 1 2 ) − x 0 2 − y 0 2 − z 0 2 = 0 (k_1^2−1)(x^2+y^2+z^2)−(2k_1^2x _1​−2x_ 0)x−(2k_1^2y_1−2y_0)y−(2k_1^2z_1−2z_0)z+k_1^2(x_1^2+y_1^2+z_1^2)−x_0^2−y_0^2−z_0^2=0 (k121)(x2+y2+z2)(2k12x12x0)x(2k12y12y0)y(2k12z12z0)z+k12(x12+y12+z12)x02y02z02=0
可知为球的轨迹方程
一般方程计算球心半径
x 2 + y 2 + z 2 + 2 a x + 2 b y + 2 c z + d = 0 x^2+y^2+z^2+2ax+2by+2cz+d=0 x2+y2+z2+2ax+2by+2cz+d=0
化作标准方程
( x + a ) 2 + ( y + b ) 2 + ( z + c ) 2 = a 2 + b 2 + c 2 − d (x+a)^2+(y+b)^2+(z+c)^2=a^2+b^2+c^2-d (x+a)2+(y+b)2+(z+c)2=a2+b2+c2d
可得球心坐标
O ( − a , − b , − c ) O(-a,-b,-c) O(a,b,c)
可得半径
r = a 2 + b 2 + c 2 − d r=\sqrt{a ^2 +b ^2+c^ 2−d} r=a2+b2+c2d

得出R1,同理解出R2以及两球球心,题目就可以解出了!
( 用到球冠体积公式)
.
.
.
.
.
.
.
不会求?
.
.
.
.
.
.
.
.
没关系! 我也不会233
球冠体积怎么求?

完成! 以下AC代码

代码

#include<bits/stdc++.h>
using namespace std;
const double pai=acos(-1);
int t;
double x[5],y[5],z[5];
double k1,k2;
void solve(double x1,double y1,double z1,double r1,double x2,double y2,double z2,double r2)
{
	double ans=0;
	double dis;//球心距离 
	dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
	if(dis>=r1+r2) 
	{
		ans=0;
		//相离或相切 
	}	
	else if(dis+r1<=r2)
	{
		ans=(4.00/3.00)*pai*r1*r1*r1;
		//内含或内切
	}
	else if(dis+r2<=r1)
	{
		ans=(4.00/3.00)*pai*r2*r2*r2;
		//内含或内切
	}
	else
	{
		double cal=(r1*r1+dis*dis-r2*r2)/(2.00*dis*r1);
        double h=r1*(1-cal);
        ans+=(1.00/3.00)*pai*(3.00*r1-h)*h*h;
        cal=(r2*r2+dis*dis-r1*r1)/(2.00*dis*r2);
        h=r2*(1.00-cal);
        ans+=(1.00/3.00)*pai*(3.00*r2-h)*h*h;
	}//相交
	printf("%.3f\n",ans);
}
int main()
{
	int i,j;
	cin>>t;
	while(t--)
	{
		for(i=0;i<4;i++)
		cin>>x[i]>>y[i]>>z[i];
		cin>>k1>>k2;
		
		double sum1=k1*k1-1;
		double c1x,c1y,c1z,c1r,t;
		c1x=(k1*k1*x[1]-x[0])/sum1;
		c1y=(k1*k1*y[1]-y[0])/sum1;
		c1z=(k1*k1*z[1]-z[0])/sum1;
		t=k1*k1*((x[1]*x[1])+(y[1]*y[1])+(z[1]*z[1]))-x[0]*x[0]-y[0]*y[0]-z[0]*z[0];
		t/=sum1;
		
		c1r=sqrt(c1x*c1x+c1y*c1y+c1z*c1z-t);
		//计算球2的球心坐标和半径 
		double sum2=k2*k2-1;
		double c2x,c2y,c2z,c2r;
		c2x=(k2*k2*x[3]-x[2])/sum2;
		c2y=(k2*k2*y[3]-y[2])/sum2;
		c2z=(k2*k2*z[3]-z[2])/sum2;
		t=k2*k2*((x[3]*x[3])+(y[3]*y[3])+(z[3]*z[3]))-x[2]*x[2]-y[2]*y[2]-z[2]*z[2];
		t/=sum2;
		
		c2r=sqrt(c2x*c2x+c2y*c2y+c2z*c2z-t);
		//计算两个球相交部分体积 
		solve(c1x,c1y,c1z,c1r,c2x,c2y,c2z,c2r);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值