三分
其实三分和二分实现是一样的,但是为什么我还要写一下呢,因为我没学的时候感觉太可怕了,学了后发现也就那样,所以我要记录一下(水题解)。
每次三分取 \(x\) 判断大小。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10005;
int t;
int n;
double a[N],b[N],c[N];
double f(double x,int i){
return x*x*a[i]+x*b[i]+c[i];
}
double check(double x){
double ans=0;
ans=f(x,1);
for(int i=2;i<=n;i++){
ans=max(ans,f(x,i));
}
return ans;
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
double l=0,r=1000,eps=1e-11,mid1,mid2;
while(r-l>eps){
mid1=l+(r-l)/3.0;
mid2=r-(r-l)/3.0;
if(check(mid1)>check(mid2)){
l=mid1;
}
else{
r=mid2;
}
}
printf("%.4lf\n",check(l));
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
solve();
}
return 0;
}
这个三分又和上面不一样(题解区里面的),但实际都差不多,都是三分取值。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10005;
int t;
int n;
double a[N],b[N],c[N];
double f(double x){
double ans=0;
for(int i=0;i<=n;i++){
ans=ans*x+a[i];
}
return ans;
}
void solve(){
double l,r,eps=1e-7,mid;
cin>>n>>l>>r;
for(int i=0;i<=n;i++){
cin>>a[i];
}
while(r-l>=eps){
mid=(l+r)/2;
if(f(mid+eps)>f(mid-eps)){
l=mid;
}
else{
r=mid;
}
}
printf("%.5lf\n",r);
}
int main(){
ios::sync_with_stdio(false);
t=1;
while(t--){
solve();
}
return 0;
}