zoukankan      html  css  js  c++  java
  • Electron Cloud

    Electron Cloud

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    The electron is described in terms of its probability distribution or probability density. This probability distribution does not have definite cutoff points; its edges are somewhat fuzzy. Hence the term "electron cloud." This cloudy probability distribution takes on different shapes, depending on the state of the atom.

    In order to describe a nuclear action, you are asked to tell where the electrons may occur.

    Here we assume that the electrons only occur within a sphere whose location and radius are given. The action consists of only two atoms.

    Input

    There are multiple test cases. The first line of input is an integer T indicating the number of test cases. (0 < T ≤ 50)

    Each test case consists of a line containing 8 integers X1Y1Z1R1X2Y2Z2 and R2, describing the coordinates and the radiuses of the two atoms. The absolute value of each coordinate do not exceed 100 and 0 < R1R2 ≤ 100.

    Output

    For each test case, output the volume of space where the electrons may occur, accurated to the nearest 0.01.

    Sample Input

    0 0 0 1 0 0 2 1 
    0 0 0 2 0 0 2 2 
    0 0 0 2 0 0 2 1 

    Sample Output

    8.38 
    56.55 
    36.00

     Sample code:

     #include<stdio.h>

    #include<math.h>
    #define PI acos(-1.0)
    struct point
    {
         
    double x,y,z;
         
    double r;
    }p1,p2;

    double dis(point a,point b)
    {
         
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
    }

    double V(double r)
    {
         
    return (4.0/3)*PI*r*r*r;
    }

    double V2(double r,double h)
    {
         
    return (2.0/3)*PI*r*r*h-(1.0/3)*PI*(r-h)*(r*r-(r-h)*(r-h));
    }

    void swap(double &a,double &b)
    {
         
    double t;
         t
    =a;
         a
    =b;
         b
    =t;
    }

    void volumn(point p1,point p2)
    {
         
    double d=dis(p1,p2);
         
    if(p1.r<p2.r) swap(p1.r,p2.r);
         
    if(p1.r+p2.r<=d)
           printf(
    "%.2f\n",V(p1.r)+V(p2.r));
         
    else if(d<=p1.r-p2.r)
           printf(
    "%.2f",V(p1.r));
         
    else
         {
              
    double r1=p1.r,r2=p2.r;
              
    double t=(r1*r1-r2*r2)/d;
              
    double h1=(d+t)/2;
              
    double h2=(d-t)/2;
              h1
    =(r1-h1);
              h2
    =(r2-h2);
              
    double ans=V(p1.r)+V(p2.r)-V2(p1.r,h1)-V2(p2.r,h2);
              printf(
    "%.2f\n",ans);
            }
    }

    int main()
    {
         
    int n;
         scanf(
    "%d",&n);
         
    while(n--)
         {
              scanf(
    "%lf%lf%lf%lf",&p1.x,&p1.y,&p1.z,&p1.r);
              scanf(
    "%lf%lf%lf%lf",&p2.x,&p2.y,&p2.z,&p2.r);
              volumn(p1,p2);
            }
         
    return 0;

    } 

  • 相关阅读:
    [bzoj3224] 普通平衡树
    [总结] 三种常见的区间贪心问题
    [NOIP2014] 飞扬的小鸟
    POJ 1185 炮兵阵地
    WOJ 1538 Stones II 转化背包问题
    WOJ 1542 Countries 并查集转化新点+最短路
    UVA 11375 高精度Bign类
    2014_csu选拔1_B
    Codeforces 405D 数学问题
    Codeforces 400C 矩阵乘法 数学规律
  • 原文地址:https://www.cnblogs.com/cpoint/p/2051275.html
Copyright © 2011-2022 走看看