三分

其实三分和二分实现是一样的,但是为什么我还要写一下呢,因为我没学的时候感觉太可怕了,学了后发现也就那样,所以我要记录一下(水题解)。

原题链接

每次三分取 \(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;
}
posted @ 2024-09-23 17:52  sad_lin  阅读(18)  评论(0编辑  收藏  举报