题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1461
求旋转曲线的体积,利用辛普森积分
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double EPS = 1e-5;
typedef long long ll;
double a,b;
double f(double x)
{
return pi * (a * pow(exp(1.0),-1.0 * x * x) + b * sqrt(1.0 * x)) *
(a * pow(exp(1.0),-1.0 * x * x) + b * sqrt(1.0 * x));
}
inline double getAppr(double l,double r){
return (f(l) + 4.0 * f((l + r) / 2) + f(r)) * (r - l) / 6.0;
}
double Simpson(double l,double r){
double sum = getAppr(l,r);
double mid = (l+r)/2;
double suml = getAppr(l,mid);
double sumr = getAppr(mid,r);
return (fabs(sum - suml - sumr) < EPS) ? sum : Simpson(l, mid) + Simpson(mid, r);
}
int main(void)
{
double V,v[10],h;
int n;
while(cin >> V >> n) {
for(int i = 0; i < n ;i++) {
cin >> a >> b >> h;
v[i] = Simpson(0,h);
}
double Min = 10000000000;
int ans;
for(int i = 0; i < n; i++) {
if( fabs(V - v[i]) < Min) {
Min = fabs(V - v[i]);
ans = i;
}
}
cout << ans << endl;
}
return 0;
}