首页 > 代码库 > 三分法模板

三分法模板

【模板】三分法

题目描述

如题,给出一个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

三分法模板