【CodeForces】gym-101205B Curvy Little Bottles (2012 ACM-ICPC World Finals B)

来源:互联网 发布:淘宝盖楼等级不够 编辑:程序博客网 时间:2024/04/28 21:42

V=lrπf2(x)dx
在f(x)是多项式情况下
lrf(x)dx=i=0naii+1(ri+1li+1)
推出以上然后就可以做了,第二部分可以二分做
(代码很丑,是打广工训练的时候“抢”时间写的……)

#include<stdio.h>#define eps 0.000001double a[23],b[23],xlow,xhigh,inc,l,r,mid;int T,n,cs;double pow(double a,int b){    double rt=1;    while (b--) rt*=a;    return rt;}inline double V(double x){    double rt=0;    for (int i=0;i<=2*n;i++) rt+=3.1415926535*b[i]/(i+1)*(pow(x,i+1)-pow(xlow,i+1));    return rt;}inline void prepare(){    for (int i=0;i<=20;i++) b[i]=0;}int main(){    while(~scanf("%d",&n))    {        cs++;        prepare();        for (int i=0;i<=n;i++) scanf("%lf",a+i);        for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) b[i+j]+=a[i]*a[j];        scanf("%lf%lf%lf",&xlow,&xhigh,&inc);        printf("Case %d: ",cs);        printf("%.2f\n",V(xhigh));        double fxxk=xlow;        for (int i=1;i<=8;i++)        {            l=xlow;r=xhigh;            for (mid=(l+r)/2;l+eps<r;mid=(l+r)/2) if (V(mid)<inc) l=mid;else r=mid;            if (l+eps<xhigh || inc<eps+V(l)) printf("%.2f ",(xlow=l)-fxxk);            else            {                if (i==1) printf("insufficient volume");                break;            }        }        puts("");    }}
0 0
原创粉丝点击