题解0001:模板三分


给出一个 NN 次函数,保证在范围 [l, r][l,r] 内存在一点 xx,使得 [l, x][l,x] 上单调增,[x, r][x,r] 上单调减。试求出 xx 的值。

思路:

3分,每次求中间左边一点的函数值和右边一点的函数值,然后比一下,让中间=l或r,循环。

#include
using namespace std;
double eps=1e-7,l,r,arr[15]={0};//eps是左右数的最大误差
int n;
double Q(double a){
	double sum=0;
	for(int i=n;i>=0;i--){
		sum=sum*a+arr[i];
	}
	return sum;
}
int main(){
	cin>>n>>l>>r;
	for(int i=n;i>=0;i--){
		cin>>arr[i];
	}
	while(fabs(l-r)>=eps){//l-r绝对值(不知道l和r那个大)<=左右差距就停止循环(找到点了)
		double mid=(l+r)/2;
		if(Q(mid+eps)>Q(mid-eps)){
			l=mid;
		}else{
			r=mid;
		}
	}
	printf("%.5lf",r);
}

相关