GCPC 13 E No Trees But Flowers. 定积分(函数绕x轴旋转体积).梯度法

题意:花瓶的轮廓用 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值