zoukankan      html  css  js  c++  java
  • hdu 5060 War

    War

    Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 98    Accepted Submission(s): 28
    Special Judge


    Problem Description
    Long long ago there are two countrys in the universe. Each country haves its own manor in 3-dimension space. Country A's manor occupys x^2+y^2+z^2<=R^2. Country B's manor occupys x^2+y^2<=HR^2 && |z|<=HZ. There may be a war between them. The occurrence of a war have a certain probability. 
    We calculate the probability as follow steps.
    1. VC=volume of insection manor of A and B.
    2. VU=volume of union manor of A and B.
    3. probability=VC/VU
     

    Input
    Multi test cases(about 1000000). Each case contain one line. The first line contains three integers R,HR,HZ. Process to end of file.

    [Technical Specification]
    0< R,HR,HZ<=100
     

    Output
    For each case,output the probability of the war which happens between A and B. The answer should accurate to six decimal places.
     

    Sample Input
    1 1 1 2 1 1
     

    Sample Output
    0.666667 0.187500
     

    Source
     


    题解及代码:


           这道题的意思非常easy:给定中心重合的一个球和一个圆柱,求出其重合体积占全部体积的比例。

          这题写起来非常麻烦,由于要分成5类分别写(可耻de把官方的图扣下来 = =!


    分类大致就是分成这5类。积分的方式这里使用的是simpson积分法。仅仅要知道被积函数和上下限就能够了,不用自己做不定积分。


    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <map>
    using namespace std;
    const double pi=3.14159265358979,eps=1e-7;
    double r,hr,hz;
    
    double f(double n)
    {
        return pi*(r*r-n*n);
    }
    
    double simpson(double a,double b)
    {
        return (b-a)/6.0*(f(a)+4*f((a+b)/2.0)+f(b));
    }
    
    double cal(double a,double b)
    {
        double sum=simpson(a,b),mid=(a+b)/2.0;
        double t=simpson(a,mid)+simpson(mid,b);
    
        if(fabs(t-sum)<eps) return sum;
    
        return cal(a,mid)+cal(mid,b);
    }
    
    
    int main()
    {
    
        while(scanf("%lf%lf%lf",&r,&hr,&hz)!=EOF)
        {
            double v=0,hv=0;
            if(hr>=r&&hz>=r)
            {
                v=4.0/3.0*pi*r*r*r;
                hv=2*pi*hr*hr*hz;
                printf("%.6lf
    ",v/hv);
                continue;
            }
            if(hr>=r&&hz<r)
            {
                v=4.0/3.0*pi*r*r*r;
                double t=2*cal(hz,r);
                hv=2*pi*hr*hr*hz;
                printf("%.6lf
    ",(v-t)/(hv+t));
                continue;
            }
            if(r*r>=hr*hr+hz*hz)
            {
                v=4.0/3.0*pi*r*r*r;
                hv=2*pi*hr*hr*hz;
                printf("%.6lf
    ",hv/v);
                continue;
            }
            if(hr<r&&hz>=r)
            {
                v=4.0/3.0*pi*r*r*r;
                double t=2*cal(sqrt(r*r-hr*hr),r)+2*sqrt(r*r-hr*hr)*pi*hr*hr;
                hv=2*pi*hr*hr*hz;
                printf("%.6lf
    ",t/(hv+v-t));
                continue;
            }
            v=4.0/3.0*pi*r*r*r;
            hv=2*pi*hr*hr*hz;
            double t=2*cal(sqrt(r*r-hr*hr),hz)+2*sqrt(r*r-hr*hr)*pi*hr*hr;
            printf("%.6lf
    ",t/(hv+v-t));
        }
        return 0;
    }
    






    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    flask基础之jijia2模板使用基础(二)
    python之微信公众号开发(基本配置和校验)
    flask插件系列之SQLAlchemy基础使用
    python基础之常用的高阶函数
    服务器部署之nginx的配置
    python之gunicorn的配置
    python内置模块之unittest测试(五)
    python之celery使用详解一
    git服务器的简单搭建
    python模块分析之logging日志(四)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4624999.html
Copyright © 2011-2022 走看看