kmjp's blog

競技プログラミング参加記です

yukicoder : No.1319 最強とんがりコーン

SRM出たばかりの時の問題が2つの円錐に関する問題だったな。
https://yukicoder.me/problems/no/1319

問題

2つの合同な円錐がある。
それぞれ底面の半径はRで高さはHである。
両者は底面が同じ平面上にあり、底面の中心の距離はDである。

両者の共通部分の体積を求めよ。

解法

高さ方向に向け共通部分の面積を数値積分していこう。
共通部分は円弧を2つ合わせた形なので、三角関数など使えば数値的に求めることができる。

double R,H,D;

void solve() {
	int i,j,k,l,r,x,y; string s;
	double pi=atan(1)*4;
	
	cin>>R>>H>>D;
	double step=H/10000000;
	double ret=0;
	D/=2;
	for(double y=step/2;y<=H;y+=step) {
		double CR=R*y/H;
		if(CR<D) continue;
		double theta=acos(D/CR);
		
		double arc=CR*CR*theta;
		double area=CR*sin(theta)*D;
		//cout<<arc-area<<endl;
		ret+=arc-area;
	}
	
	ret*=2*step;
	_P("%.12lf\n",ret);
	
}

まとめ

大学入試みたいだな。