CUGBACM130715 组队赛 BNU Curvy Little Bottles - from lanshui_Yang

B.Curvy Little Bottles

Final的题就是不一样,只是读题就花了好长时间。。。

题目大意:先输入一个整数n , 代表表达式

的最高项次数,如第一个例子中,n = 1 ,代表 P = a0  + a1 * x ,接下来输入n + 1 个实数a0 ……an ,

然后输入Xlow和Xhigh ,如图 :

CUGBACM130715 组队赛 BNU Curvy Little Bottles - from lanshui_Yang_第1张图片

求所围几何体的体积,然后往这个几何体注水,每次注入 V (题目中为inc) 单位的水 ,求出每次注入水后,水的高度。此题,需要高数知识和二分法,先求出表达式P 的原函数 ,然后用二分法求每次注入水后的液面高度。请看代码:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std ;
const double eps = 0.00001 ;
const double pi = acos(-1.0) ;
double xishu[12] ;
double vis[10] ;  // 求每次注水后的液面高
int n ;
double yuan(double x)  // P的原函数
{
    int i , j ;
    double tmp ;
    double sum = 0 ;
    for(i = 0 ; i <= n ; i ++)
    {
        for( j = 0 ; j <= n ; j ++)
        {
            tmp = xishu[i] * xishu[j] ;
            int xt = i + j ;
            sum += (tmp / (xt + 1) * pow(x , xt + 1)) ;
        }
    }
    sum *= pi ;
    return sum ;
}
int main()
{
    int cx = 0 ;
    while (scanf("%d" , &n) != EOF)
    {
        int i;
        memset(xishu , 0 ,sizeof(xishu)) ;
        for(i = 0 ; i <= n ; i ++)
        {
            scanf("%lf" , &xishu[i]) ;  // 输入各项系数
        }
        double xl , xh ;
        double v ;
        scanf("%lf%lf%lf" , &xl , &xh , &v) ;
        double k ;
        double vans = 0 ;
        int cnt = 0 ;
        double vt = v ;
        int pan = 0 ;
        vans = yuan(xh) - yuan(xl) ;  // 算体积V
        printf("Case %d: %.2f\n" , ++ cx , vans) ;
        cnt = int (vans / v) ;
        if(cnt > 8)
        {
            cnt = 8 ;
        }
        if(cnt == 0)
        {
            printf("insufficient volume\n") ;
            continue ;
        }
        for(int k = 1 ; k <= cnt ; k ++)
        {
            double left = xl , right = xh , mid ;
            while (right - left > eps)
            {
                mid = (left + right) / 2 ;
                double suma = yuan(mid) - yuan(xl) ;
                if(suma < vt)
                {
                    left = mid ;
                }
                else
                {
                    right = mid ;
                }
            }
            mid = (left + right) / 2 ;
            vis[k] = mid ;
            vt += v ;  // 注意此处 !
        }
        int j ;
        for(j = 1 ; j <= cnt ; j ++)
        {
            printf("%.2f" , vis[j]-xl) ; // 注意此处,要输出页面相对杯底的高度
            if(j < cnt)
            {
                printf(" ") ;
            }
        }
        printf("\n") ;
    }
    return 0 ;
}


你可能感兴趣的:(+,二分,高数)