2018年東北農業大學春季校賽-A:wyh的曲線(Simpson)
阿新 • • 發佈:2019-02-20
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
空間限制: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; }