题意:花瓶的轮廓用 f(x)= a*e^(-x^2) + b*sqrt(x) 来描述. a,b为常数.x为花瓶的高度.
花瓶的体积为:f绕着x轴旋转一圈. 给出目标体积V 以及n个花瓶的参数a,b,h.
0<V<=1e5.0<n<=5.任意两个花瓶的体积至少差1e-4.问哪一个花瓶体积最接近V?.
高度h为x轴的右边界.函数f(x)绕着x轴旋转一圈.选两点x,x+dx.旋转后为一个圆环.其体积为 π*f^2(x)*dx.
则花瓶体积体积V=∫[0,h] π*f^2(x)*dx
因为积分时,f(x)求不出原函数.那么用梯度法去近似答案.每个梯形的高取1e-4即可.
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
const int N=2e2+5;
const ld pi=acos(-1.0),e=2.71828;
int n;
ld V,a[N],b[N],h[N];
ld f(ld x,ld a,ld b){
ld y=a*exp(-x*x)+b*sqrt(x);
return y*y*pi;
}
ld trapezoid(ld a,ld b,ld c,ld d){
return (f(a,c,d)+f(b,c,d))*(b-a)/2.0;
}
ld integrate(ld a,ld b,ld c,ld d){
ld dx=1e-5,vol=0;
int n=floor((b-a)/dx);
for(int i=0;i<n;i++)
vol+=trapezoid(a+dx*1.0*i,a+dx*1.0*(i+1),c,d);
vol+=trapezoid(a+dx*n,b,c,d);
return vol;
}
int main(){
cin>>V>>n;
for(int i=0;i<n;i++) cin>>a[i]>>b[i]>>h[i];
ld mn=2e18;
int res;
for(int i=0;i<n;i++){
ld vol=integrate(0,h[i],a[i],b[i]);
if(fabs(V-vol)<=mn){
mn=fabs(V-vol);
res=i;
}
// cout<<i<<' '<<vol<<'\n';
}
cout<<res<<'\n';
return 0;
}