今天组队赛做了final题,最后一题也没出,真是有些感慨呀,差距还是很大的。
有一下几个方面:
1.英文题不太好读懂。得多练习。
2.算法很多都忘记了。得每隔一段时间复习下。
这里赛后做了B题:
原来想不求原函数,直接划分小单元求积分的,不过这种方法精度不好控制,因为精度和复杂度有关。
后来用求原函数的方法来写,还是Wa了几发,原来是太注意题目中的0.01和0.05,最后没考虑这两点就过了。唉,有些时候都不知道到底啥得考虑,啥得不考虑了。
代码:
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#define pi 3.141592653
#define exp 1e-8
#define maxn 20
#define INF 0xfffffff
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
using namespace std;
int n,cnt;
double xl,xr,v;
double a[maxn],num[maxn];
double f(double L,double R)
{
double ret=0;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
ret=ret+(a[i]*a[j])*(pow(R,i+j+1)-pow(L,i+j+1))/(1.0*(i+j+1));
}
}
return ret;
}
int main()
{
int c=1;
while(scanf("%d",&n)!=EOF)
{
//memset(a,0,sizeof(a));
for(int i=0;i<=n;i++)
{
scanf("%lf",&a[i]);
}
scanf("%lf %lf %lf",&xl,&xr,&v);
double re=pi*f(xl,xr);
printf("Case %d: %.2f\n",c++,re);
cnt=1;
double mv=v;
for(int i=0;i<8;i++)
{
mv=v*cnt;
//cout<<mv<<endl;
if(mv>re)
break;
double l=xl,r=xr,mid;
while(r-l>exp)
{
mid=(l+r)/2.0;
if(pi*f(xl,mid)<mv)
{
l=mid;
}
else
{
r=mid;
}
}
//if(xr-l<0.01||l-num[cnt-1]<0.05)
//break;
num[cnt++]=l;
}
if(cnt==1)
{
printf("insufficient volume\n");
continue;
}
for(int i=1;i<cnt;i++)
{
printf("%.2f",num[i]-xl);
if(i<cnt-1)
printf(" ");
else
printf("\n");
}
}
return 0;
}