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 ; }