HDU 5060 圆柱和圆求交

来源:互联网 发布:php 面向接口编程 编辑:程序博客网 时间:2024/06/05 08:10

思路 : 分5中情况讨论 ,两种情况是完全包含的 , 另外三种情况是部分包含的, 需要积分一下

比赛的时候写的辛普森 = = 不是TLE就是WA ...
早知道就直接算了


#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;#define PI acos( -1.0 )inline double f( double r , double y ) {return PI * ( r * r * y - 1 / 3.0 * y * y * y ) ;}int main(){double r , hr , hz ;while( scanf( "%lf%lf%lf" , &r , &hr , &hz ) != EOF ) {double vr = 4 / 3.0 * PI * r * r * r ;double vh = PI * hr * hr * hz * 2 ;double ans ;if( r <= hr && r <= hz ) {ans = vr / vh ;}else if( hr * hr + hz * hz <= r * r ) {ans = vh / vr ;}else if( hz >= r && hr <= r ) {double hh = sqrt( r * r - hr * hr ) ;double vc = 2 * hh * PI * hr * hr ;vc += 2 * ( f( r , r ) - f( r , hh ) ) ;double vu = vr + vh - vc ;ans = vc / vu ;}else if( r >= hz && r <= hr ) {double vc = 2 * ( f( r , hz ) - f( r , 0 ) ) ;double vu = vr + vh - vc ;ans = vc / vu ;}else{double hh = sqrt( r * r - hr * hr ) ;double vc = 2 * hh * PI * hr * hr ;vc += 2 * ( f( r , hz ) - f( r , hh ) ) ;double vu = vr + vh - vc ;ans = vc / vu ;}printf( "%f\n" , ans ) ;}return 0 ;}


0 0
原创粉丝点击