1. 程式人生 > >2018年東北農業大學春季校賽-A:wyh的曲線(Simpson)

2018年東北農業大學春季校賽-A:wyh的曲線(Simpson)

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

給你三組數列,分別為

現在給你一個式子:

然後我們可以將這個函式畫在一個xoy直角座標系下,x的範圍為[0,100],當然我們可以得到一條曲線,現在你們涵哥讓你們求出這個曲線的長度,結果保留兩位小數

輸入描述:

單組輸入:

每組測試資料第一行輸入一個整數n。

接下來n行,每行3個數代表ki,ai,bi。(這裡原題題目描述有誤,原題描述的是ai,bi,ki,實際上是ki,ai,bi)

Data limit:

輸出描述:

對於每組測試資料,輸出對應答案,結果保留兩位小數
示例1

輸入

3 
1 2 3 
4 5 6 
7 8 9

輸出

215.56
思路:辛普森公式。
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+100;
const int MOD=1e9+7;
const double PI=acos(-1);
typedef long long ll;
int n;
double A[60],B[60],K[60];
double F(double x)
{
    double ans=100,res=0;
    for(int i=1;i<=n;i++)
    {
        if(K[i]*(x-A[i])*(x-A[i])+B[i]<ans)
        {
            ans=K[i]*(x-A[i])*(x-A[i])+B[i];
            res=2*K[i]*(x-A[i]);
            if(K[i]*(x-A[i])*(x-A[i])+B[i]>100)res=0;
        }
    }
    return sqrt(1+res*res);
}
double simpson(double a,double b)
{
	double c=a+(b-a)/2;
    return (F(a)+4*F(c)+F(b))*(b-a)/6;   //F(x)是被積分的函式
}
double asr(double a,double b,int dep,double eps,double A)
{
	double c=a+(b-a)/2;
	double L=simpson(a,c);
	double R=simpson(c,b);
	if(dep>=10&&fabs(L+R-A)<=15*eps)return L+R+(L+R-A)/15.0;
	return asr(a,c,dep+1,eps/2,L)+asr(c,b,dep+1,eps/2,R);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%lf%lf%lf",&K[i],&A[i],&B[i]);
    printf("%.2lf\n",asr(0,100,0,1e-8,simpson(0,100)));
    return 0;
}