【随意学学】三分法

三分法其实是很naive的东西……

但是不知道为什么蒟蒻我之前一直没空学……

大概就是求一类单峰的函数,每次把区间三分(以求极小值举例),如果$f(mid1)<f(mid2)$说明解在$[L,mid2]$中,反之解在$[mid2,R]$中。

裸题1:LA 5009

 1 #include<bits/stdc++.h>
 2 #define N 100005
 3 using namespace std;
 4 int n,a[N],b[N],c[N];
 5 inline double f(double x){
 6     double ans=a[1]*x*x+b[1]*x+c[1];
 7     for(int i=2;i<=n;i++)ans=max(ans,a[i]*x*x+b[i]*x+c[i]);
 8     return ans;
 9 }
10 inline int read(){
11     int f=1,x=0;char ch;
12     do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
13     do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
14     return f*x;
15 }
16 int main(){
17     int T=read();
18     while(T--){
19         n=read();
20         for(int i =1;i<=n;i++)a[i]=read(),b[i]=read(),c[i]=read();
21         double l=0.0,r=1000.0;
22         for(int i=1;i<=100;i++){
23             double mid1=l+(r-l)/3,mid2=r-(r-l)/3;
24             if(f(mid1)<f(mid2))r=mid2;else l=mid1;
25         }
26         printf("%.4lf\n",f(l));
27     }
28     return 0;
29 }

裸题2:洛谷模版

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 double l,r,a[20],xsh[20];
 5 inline double f(double x){
 6     double ans=0;
 7     for(int i=1;i<=n;i++){
 8         double tmp=a[i];
 9         for(int j=1;j<=n-i+1;j++)tmp*=x;
10         ans+=tmp;
11     }
12     return ans+a[n+1];
13 }
14 int main(){
15     scanf("%d",&n);scanf("%lf%lf",&l,&r);
16     for(int i=1;i<=n+1;i++)scanf("%lf",&a[i]);
17     double lx=l,rx=r;
18     while(abs(lx-rx)>0.000001){
19         double x1=lx+(rx-lx)/3,x2=rx-(rx-lx)/3;
20         if(f(x1)>f(x2)) rx=x2;
21         else lx=x1;
22     }
23     printf("%.5lf\n",lx);
24     return 0;
25 }

 

posted @ 2017-05-08 18:04  zcysky  阅读(334)  评论(0编辑  收藏  举报