【随意学学】三分法
三分法其实是很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 }
zzq wc-ctsc-apio-NOI Au;yql精通多项式;zyz精通女装;由乃精通数据结构;孔老师是毒奶大师;我没有学上:我们都有光明的前途。