【HDU】5060 War 求圆柱和圆的体积交与体积并

传送门:【HDU】5060 War


题目分析:积分题。

一共五种情况。两种完全包含,三种部分包含。部分包含需要用到求一个体积的积分式:从坐标x->R部分的圆的体积。这个积分式会求则剩余三种全部可以用这个积分式解决。具体见代码。


代码如下:


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std ;
  
typedef long long LL ;
  
#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )
#define For( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define rev( i , a , b ) for ( int i = a ; i >= b ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define clr( a , x ) memset ( a , x , sizeof a )
#define cpy( a , x ) memcpy ( a , x , sizeof a )
 
const int MAXN = 105 ;
const double pi = acos ( -1.0 ) ;

int R , HR , HZ ;


double f2 ( double x1 , double x2 ) {
	return R * R * pi * ( x2 - x1 ) - 1.0 / 3.0 * pi * ( x2 * x2 * x2 - x1 * x1 * x1 ) ;
}

int solve () {
	double V1 = pi * R * R * R * 4.0 / 3.0 ;
	double V2 = 2.0 * HR * HR * pi * HZ ;
	if ( HR * HR + HZ * HZ <= R * R ) {
		printf ( "%.6f\n" , V2 / V1 ) ;
	} else if ( HR >= R && HZ >= R ) {
		printf ( "%.6f\n" , V1 / V2 ) ;
	} else if ( HR <= R && HZ <= R ) {
		double y1 = HZ ;
		double y2 = sqrt ( R * R - HR * HR ) ;
		double V = 2.0 * ( HR * HR * y2 * pi + f2 ( y2 , R ) - f2 ( y1 , R ) ) ;
		printf ( "%.6f\n" , V / ( V1 + V2 - V ) ) ;
	} else if ( HR > R && HZ <= R ) {
		double y1 = HZ ;
		double y2 = 0 ;
		double V = 2.0 * ( f2 ( y2 , R ) - f2 ( y1 , R ) ) ;
		printf ( "%.6f\n" , V / ( V1 + V2 - V ) ) ;
	} else if ( HR <= R && HZ >= R ) {
		double y = sqrt ( R * R - HR * HR ) ;
		double V = 2.0 * ( HR * HR * y * pi + f2 ( y , R ) ) ;
		printf ( "%.6f\n" , V / ( V1 + V2 - V ) ) ;
	}
}

int main () {
	while ( ~scanf ( "%d%d%d" , &R , &HR , &HZ ) ) solve () ;
	return 0 ;
}


你可能感兴趣的:(HDU)