ACM icpc 2012 word final第一水题,思路很简单,比较惊奇的是总决赛的出题思路,竟然会有积分题目,虽然这个题目关键不是积分,但是较之我们的区域赛等,明显的偏重于数学,不仅仅是数学知识,还有数学思维。
题意很简单,就是给你一个多项式p(x),一个下限,一个上限,然后这个多项式的曲线绕x轴旋转,会形成一个瓶子,先要计算出这个瓶子的总体积,然后给你一个v,从瓶子底部每v标记下,就是算出高度。
典型的数学题目,\int ^b _a p^2(x)dx (tex语言),就是体积了。体积当然是递增的,所以就可以二分了。
直接上代码:
#include <stdio.h>
#include <math.h>
#define pi 3.14159265358
double rest(double a[],int n,double x0,double xt)
{
int i;
double sum=0.0;
for(i=0;i<=n;i++)
sum+=(pow(xt,i+1)-pow(x0,i+1))*a[i]/(i+1.0);
return sum*pi;
}
double br(double a[],int n,double x0,double st,double xt,double v)
{
double mid=(xt+st)*0.5;
if(fabs(rest(a,n,x0,mid)-v)>0.001)
if(rest(a,n,x0,mid)-v>0)
return br(a,n,x0,st,mid,v);
else
return br(a,n,x0,mid,xt,v);
else
return mid;
}
int main()
{
int i,j,k,l,m=0,n;
double p[30],p1[20],low,high,bound,st;
while(~scanf("%d",&n))
{
for(i=0;i<=n;i++)
scanf("%lf",&p1[i]);
for(i=0;i<30;i++)
p[i]=0.0;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
p[i+j]+=p1[i]*p1[j];
scanf("%lf%lf%lf",&low,&high,&bound);
printf("Case %d: %.2lf\n",++m,st=rest(p,2*n,low,high));
if(st<bound)
puts("insufficient volume");
else
{
st=low;
for(i=0;i<8;i++)
{
if(rest(p,2*n,low,high)<bound)
break;
printf("%.2lf ",(low=br(p,2*n,low,low,high,bound))-st);
}
printf("\n");
}
}
}