标签:
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4498
思路:分段积分。求出每个函数与y=100和每两个函数图像的交点,排序后枚举每段取最小值,分段积分。
#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define debu using namespace std; const int maxn=200; const double eps=1e-8; int best,n; vector<double> x; int a[maxn],b[maxn],k[maxn]; int A[maxn],B[maxn],C[maxn]; void make(int a,int b,int c) { if(a==0&&b==0) return ; else if(a==0) { double tmp=-1.0*c/b; if(tmp>=0&&tmp<=100) x.push_back(tmp); } else { double delta=b*b-4.0*a*c; if(delta<0) return ; else if(delta==0) { double tmp=-1.0*b/(2.0*a); if(tmp<=100&&tmp>=0) x.push_back(tmp); } else { double tmp1=(-1.0*b+sqrt(delta))/(2.0*a); if(tmp1<=100&&tmp1>=0) x.push_back(tmp1); double tmp2=(-1.0*b-sqrt(delta))/(2.0*a); if(tmp2<=100&&tmp2>=0) x.push_back(tmp2); } } } double F(double x) { return sqrt(1.0+(2.0*A[best]*x+1.0*B[best])*(2*A[best]*x+1.0*B[best])); } double simpson(double l,double r) { return (F(l)+4*F((l+r)/2.0)+F(r))*(r-l)/6.0; } double simpson(double l,double r,double all,double eps) { double m=(l+r)/2.0; double L=simpson(l,m),R=simpson(m,r); if(fabs(L+R-all)<=15*eps) return L+R+(L+R-all)/15; return simpson(l,m,L,eps/2.0)+simpson(m,r,R,eps/2.0); } double simpson(double l,double r,double eps) { return simpson(l,r,simpson(l,r),eps); } int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug int t; scanf("%d",&t); while(t--) { double ans=0.0; x.clear(); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d%d%d",&k[i],&a[i],&b[i]); A[0]=B[0],C[0]=100.0; for(int i=1; i<=n; i++) { A[i]=k[i]; B[i]=-2*k[i]*a[i]; C[i]=k[i]*a[i]*a[i]+b[i]; //make(A[i],B[i],C[i]); } for(int i=0;i<=n;i++) for(int j=i+1;j<=n;j++) make(A[i]-A[j],B[i]-B[j],C[i]-C[j]); x.push_back(0),x.push_back(100); sort(x.begin(),x.end()); /*for(int i=0;i<x.size()-1;i++) cout<<x[i]<<" "; cout<<x[x.size()-1]<<endl;*/ for(int i=0; i<x.size()-1; i++) { best=0; double l=x[i],r=x[i+1]; if(fabs(l-r)<1e-8) continue; double mid=(l+r)/2; for(int j=1; j<=n; j++) { double tmp1=A[best]*mid*mid+B[best]*mid+C[best]; double tmp2=A[j]*mid*mid+B[j]*mid+C[j]; if(tmp2<tmp1) best=j; } //cout<<best<<" "<<l<<" "<<r<<" "<<simpson(l,r,eps)<<endl; ans+=simpson(l,r,eps); } printf("%.2f\n",ans); } return 0; }
Hdu 4498 Function Curve(Simpson积分)
标签:
原文地址:http://blog.csdn.net/wang2147483647/article/details/52122956