今天组队赛做了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; }