您的位置:首页 > 编程语言 > C语言/C++

130716ACM-ICPC World Finals, 2012练习赛Curvy Little Bottles

2013-07-16 11:31 183 查看
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
#include<cstdio>
using namespace std;
double pi=acos(-1.0);
double getV(double a[],int n,double xl,double xh)//积分算体积,利用for循环写出原函数。
{
int i;
double ans=0.0,num,sum,tmp;
for(i=0; i<=n; ++i)
{
num=pow(xh,i+1);
sum=pow(xl,i+1);
tmp=i+1.0;
ans+=a[i]*(num-sum)/tmp;
//cout<<ans<<endl;
}
return pi*ans;
}
double getH(double a[],int n,double xl,double xm,double xh,double V)//二分求答案
{
double id=(xh+xm)/2.0;
if(abs(V-getV(a,n,xl,id))>0.001)
{
if((getV(a,n,xl,id)-V)>0)
{
return getH(a,n,xl,xm,id,V);
}
else
{
return getH(a,n,xl,id,xh,V);
}
}
else
{
return id;
}
}
int main()
{
int i,j,k,cas=0,n;
double t[30],num[30],low,high,tmp,flag;
while(scanf("%d",&n)!=EOF)
{
cas++;
for(i=0; i<=n; ++i)
{
scanf("%lf",&num[i]);
}
scanf("%lf%lf%lf",&low,&high,&tmp);
memset(t,0.0,sizeof(t));//初始化
for(i=0; i<=n; ++i)
{
for(j=0; j<=n; ++j)
{
t[i+j]+=num[i]*num[j];
}
}
flag=getV(t,2*n,low,high);
printf("Case %d: %.2lf\n",cas,flag);
if(flag<tmp)
{
printf("insufficient volume\n");//没有办法分出一个
}
else
{
flag=low;
for(i=0; i<8; ++i)
{
if(getV(t,2*n,low,high)<tmp)
{
break;
}
low=getH(t,2*n,low,low,high,tmp);
if(i==0)//注意输出空格格式
{
printf("%.2lf",low-flag);
}
else
{
printf(" %.2lf",low-flag);
}
}
printf("\n");
}
}
return 0;
}

做final的题实在是太受罪了,太难了,最后也只做出这一题。
题意很简单,就是给你个x的多项式,然后此多项式围绕x轴旋转一周形成一个瓶子,先问你瓶子的总体积V,再问每一定体积的x0的间隔。我只能说最简单的题都难成这样,后面咋做啊。。。主要还是太水啊。。。数学题,积分求体积,二分查找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 编程