【模板】三分法
题目描述
如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。
输入输出格式输入格式:
第一行一次包含一个正整数N和两个实数l、r,含义如题目描述所示。
第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数。
输出格式:
输出为一行,包含一个实数,即为x的值。四舍五入保留5位小数。
输入输出样例
输入样例#1:
3 -0.9981 0.5 1 -3 -3 1
输出样例#1:
-0.41421
话说要注意的地方大概就是最好控制次数,不然容易精度流失
画了一个简陋的图
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 double a[20],l,r; 7 int n; 8 void inti() 9 { 10 scanf("%d%lf%lf",&n,&l,&r); 11 for(int i=n;i>=0;i--) 12 scanf("%lf",&a[i]); 13 } 14 double f(double x) 15 { 16 double tmp=1,sum=a[0]; 17 for(int i=1;i<=n;i++) 18 { 19 tmp=tmp*x; 20 sum+=tmp*a[i]; 21 } 22 return sum; 23 } 24 void work() 25 { 26 double mid1,mid2; 27 for(int i=1;i<=200;i++) 28 { 29 mid1=l+(r-l)/3; 30 mid2=l+(r-l)/3*2; 31 if(f(mid1)>f(mid2)) r=mid2; 32 else l=mid1; 33 } 34 printf("%.5lf",l); 35 36 } 37 int main() 38 { 39 inti(); 40 work(); 41 return 0; 42 }
以上By Native_carrot
时间: 2024-10-27 13:19:09