1. 程式人生 > >洛谷 4525 && 洛谷 4526 【模板】自適應辛普森法

洛谷 4525 && 洛谷 4526 【模板】自適應辛普森法

題目:https://www.luogu.org/problemnew/show/P4525

   https://www.luogu.org/problemnew/show/P4526

參考:https://blog.csdn.net/VictoryCzt/article/details/80660113

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
db L,R,a,b,c,d;
db f(db x){
return (c*x+d)/(a*x+b);} db cal(db l,db r){return (f(l)+4*f((l+r)/2)+f(r))*(r-l)/6;} db simp(db l,db r,db eps,db ret) { db mid=(l+r)/2,vl=cal(l,mid),vr=cal(mid,r); if(fabs(vl+vr-ret)<=eps)return ret; return simp(l,mid,eps/2,vl)+simp(mid,r,eps/2,vr); } int main() { scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R); printf(
"%.6f\n",simp(L,R,1e-8,cal(L,R))); return 0; }

第二題就直接看了看題解……函式積到20就可以了,後面趨於0;不能從0開始積,因為 x 在分母。那個冪呼叫 pow( ) 就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
const db eps=1e-6;
db a;
db f(db x){return pow(x,a/x-x);}
db cal(db l,db r){
return (f(l)+4*f((l+r)/2)+f(r))*(r-l)/6;} db simp(db l,db r,db eps,db ret) { db mid=(l+r)/2,vl=cal(l,mid),vr=cal(mid,r); if(fabs(vl+vr-ret)<=eps)return ret; return simp(l,mid,eps/2,vl)+simp(mid,r,eps/2,vr); } int main() { scanf("%lf",&a); if(a<0)puts("orz"); else printf("%.5f\n",simp(eps,20,eps,cal(eps,20))); return 0; }