B.Curvy Little Bottles
Final的题就是不一样,只是读题就花了好长时间。。。
题目大意:先输入一个整数n , 代表表达式
的最高项次数,如第一个例子中,n = 1 ,代表 P = a0 + a1 * x ,接下来输入n + 1 个实数a0 ……an ,
然后输入Xlow和Xhigh ,如图 :
求所围几何体的体积,然后往这个几何体注水,每次注入 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 ;
}